CakeFest 2024: The Official CakePHP Conference

NumberFormatter sınıfı

(No version information available, might only be in Git)

Giriş

Uygulamalar sayılar üzerinde işlem yapmak ve bunları saklamak için yerelden bağımsız bir ikil gösterim kullanır. Sayılar gösterilirken veya basılırken bunlar yerele özgü dizgelere dönüştürülür. Örneğin, 12345.67 sayısı ABD için "12,345.67", Fransa için "12 345,67" ve Almanya ve Türkiye için "12.345,67" biçimindedir.

NumberFormatter (SayıBiçemleyici) sınıfınca sağlanmış yöntemleri çağırmak suretiyle sayılar, paralar ve yüzdeler öntanımlı yerele veya belirtilen yerele uygun olarak biçemlenebilir. NumberFormatter sınıfı yerele duyarlı olduğundan her yerel için yeni bir sayı biçemleyici oluşturmak gerekir. NumberFormatter sınıfının yöntemleri kayan noktalı sayılar gibi ilkel sayı türlerini biçemler ve bunları yerele özgü dizgeler olarak çıktılar.

Paraları, uygun bir sayı ve para birimi simgesiyle biçemleyip bir dizge olarak döndürmek için bir biçemleyici oluşturmak amacıyla para biçemleme türü kullanılabilir. Şüphesiz, NumberFormatter sınıfı paralar arasındaki kıymet oranlarını bilmez ve belirtilen paranın değerini belirtilen yerele göre dönüştürmez. Yani para birimi ne olursa olsun para biriminin yanında hep belirtilen miktar görünür. 9988776.65 değeri için sonuçlar şöyle olabilir:

  • Fransa'da 9 988 776,65 €
  • Türkiye'de 9.988.776,65 YTL veya 9.988.776 TL
  • ABD'de $9,988,776.65

Yüzdeleri biçemlemek için, yüzde biçemleme türü kullanılarak yerele özgü bir biçemleyici oluşturulur. Bu biçemleyici ile örneğin, 0.75 gibi bir ondalık sayı %75 olarak gösterilir.

Sayıların hecelenmesi gibi daha karmaşık biçemlemeler için kurala dayalı sayı biçemleyici kullanılır.

Sınıf Sözdizimi

class NumberFormatter {
/* Sabitler */
public const int PATTERN_DECIMAL;
public const int DECIMAL;
public const int CURRENCY;
public const int PERCENT;
public const int SCIENTIFIC;
public const int SPELLOUT;
public const int ORDINAL;
public const int DURATION;
public const int PATTERN_RULEBASED;
public const int IGNORE;
public const int CURRENCY_ACCOUNTING;
public const int DEFAULT_STYLE;
public const int ROUND_CEILING;
public const int ROUND_FLOOR;
public const int ROUND_DOWN;
public const int ROUND_UP;
public const int ROUND_HALFEVEN;
public const int ROUND_HALFDOWN;
public const int ROUND_HALFUP;
public const int PAD_BEFORE_PREFIX;
public const int PAD_AFTER_PREFIX;
public const int PAD_BEFORE_SUFFIX;
public const int PAD_AFTER_SUFFIX;
public const int PARSE_INT_ONLY;
public const int GROUPING_USED;
public const int MAX_INTEGER_DIGITS;
public const int MIN_INTEGER_DIGITS;
public const int INTEGER_DIGITS;
public const int MAX_FRACTION_DIGITS;
public const int MIN_FRACTION_DIGITS;
public const int FRACTION_DIGITS;
public const int MULTIPLIER;
public const int GROUPING_SIZE;
public const int ROUNDING_MODE;
public const int ROUNDING_INCREMENT;
public const int FORMAT_WIDTH;
public const int PADDING_POSITION;
public const int LENIENT_PARSE;
public const int POSITIVE_PREFIX;
public const int POSITIVE_SUFFIX;
public const int NEGATIVE_PREFIX;
public const int NEGATIVE_SUFFIX;
public const int PADDING_CHARACTER;
public const int CURRENCY_CODE;
public const int DEFAULT_RULESET;
public const int PUBLIC_RULESETS;
public const int PERCENT_SYMBOL;
public const int ZERO_DIGIT_SYMBOL;
public const int DIGIT_SYMBOL;
public const int MINUS_SIGN_SYMBOL;
public const int PLUS_SIGN_SYMBOL;
public const int CURRENCY_SYMBOL;
public const int EXPONENTIAL_SYMBOL;
public const int PERMILL_SYMBOL;
public const int PAD_ESCAPE_SYMBOL;
public const int INFINITY_SYMBOL;
public const int NAN_SYMBOL;
public const int TYPE_DEFAULT;
public const int TYPE_INT32;
public const int TYPE_INT64;
public const int TYPE_DOUBLE;
public const int TYPE_CURRENCY;
/* Yöntemler */
public __construct(string $yerel, int $tür, ?string $kalıp = null)
public static create(string $yerel, int $tür, ?string $kalıp = null): ?NumberFormatter
public formatCurrency(float $miktar, string $para_birimi): string|false
public format(int|float $sayı, int $tür = NumberFormatter::TYPE_DEFAULT): string|false
public getAttribute(int $öznitelik): int|float|false
public getErrorCode(): int
public getLocale(int $tür = ULOC_ACTUAL_LOCALE): string|false
public getSymbol(int $simge): string|false
public getTextAttribute(int $öznitelik): string|false
public parseCurrency(string $dizge, string &$para_simgesi, int &$konum = null): float|false
public parse(string $dizge, int $tür = NumberFormatter::TYPE_DOUBLE, int &$konum = null): int|float|false
public setAttribute(int $öznitelik, int|float $değer): bool
public setPattern(string $kalıp): bool
public setSymbol(int $simge, string $değer): bool
public setTextAttribute(int $öznitelik, string $değer): bool
}

Öntanımlı Sabitler

Bu biçemler numfmt_create() işlevi tarafından biçemleyici türünü tanımlamak için kullanılırlar.

NumberFormatter::PATTERN_DECIMAL
Şablona göre tanımlı ondalık biçem
NumberFormatter::DECIMAL
Ondalık biçem
NumberFormatter::CURRENCY
Para birimi biçemi
NumberFormatter::PERCENT
Yüzde biçemi
NumberFormatter::SCIENTIFIC
Bilimsel sayı gösterim biçemi
NumberFormatter::SPELLOUT
Kurala dayalı heceleme biçemi
NumberFormatter::ORDINAL
Kurala dayalı sıra gösterim biçemi
NumberFormatter::DURATION
Kurala dayalı süre gösterim biçemi
NumberFormatter::PATTERN_RULEBASED
Şablona göre tanımlı kurala dayalı biçem
NumberFormatter::CURRENCY_ACCOUNTING
Muhasebe için para birimi biçemi, örneğin, negatif para birimi miktarı için -$3.00 yerine ($3.00) gibi. PHP 7.4.1 itibariyle ve ICU 53 ile kullanılabilir.
NumberFormatter::DEFAULT_STYLE
Yerele özgü öntanımlı biçem
NumberFormatter::IGNORE
PATTERN_DECIMAL için takma ad

Bu sabitler sayıların nasıl çözümlenip biçemleneceğini tanımlar. numfmt_format() ve numfmt_parse() işlevlerinin bağımsız değişkenleri olarak kullanılırlar.

NumberFormatter::TYPE_DEFAULT
Türü değişken türünden türet
NumberFormatter::TYPE_INT32
32 bitlik tamsayı olarak çözümle/biçemle
NumberFormatter::TYPE_INT64
64 bitlik tamsayı olarak çözümle/biçemle
NumberFormatter::TYPE_DOUBLE
Bir kayan noktalı sayı olarak çözümle/biçemle
NumberFormatter::TYPE_CURRENCY
Para birimi olarak çözümle/biçemle. PHP 8.3.0'dan itibaren kullanımdan kaldırılmıştır

numfmt_get_attribute() ve numfmt_set_attribute() işlevi tarafından kullanılan sayı biçemleme öznitelikleri:

NumberFormatter::PARSE_INT_ONLY
Sadece tamsayıları çözümle.
NumberFormatter::GROUPING_USED
Gruplama ayracı kullan.
NumberFormatter::DECIMAL_ALWAYS_SHOWN
Ondalık noktayı daima göster.
NumberFormatter::MAX_INTEGER_DIGITS
Azami tamsayı hane sayısı.
NumberFormatter::MIN_INTEGER_DIGITS
Asgari tamsayı hane sayısı.
NumberFormatter::INTEGER_DIGITS
Tamsayı hane sayısı.
NumberFormatter::MAX_FRACTION_DIGITS
Ondalık kısım azami hane sayısı
NumberFormatter::MIN_FRACTION_DIGITS
Ondalık kısım asgari hane sayısı.
NumberFormatter::FRACTION_DIGITS
Ondalık kısım hane sayısı
NumberFormatter::MULTIPLIER
Çarpan.
NumberFormatter::GROUPING_SIZE
Grup genişliği.
NumberFormatter::ROUNDING_MODE
Yuvarlama kipi.
NumberFormatter::ROUNDING_INCREMENT
Yuvarlama artışı.
NumberFormatter::FORMAT_WIDTH
Çıktı biçeminde dolgu genişliği.
NumberFormatter::PADDING_POSITION
Dolgunun konumu. Olası değerler için dolgu konumlama sabitlerine bakınız.
NumberFormatter::SECONDARY_GROUPING_SIZE
İkincil gruplama genişliği.
NumberFormatter::SIGNIFICANT_DIGITS_USED
Kıymetli haneleri kullan.
NumberFormatter::MIN_SIGNIFICANT_DIGITS
Asgari kıymetli hane sayısı.
NumberFormatter::MAX_SIGNIFICANT_DIGITS
Azami kıymetli hane sayısı.
NumberFormatter::LENIENT_PARSE
Kurala dayalı biçemlerde kullanılan esnek çözümleme kipi.

numfmt_get_text_attribute() ve numfmt_set_text_attribute() işlevlerinde kullanılan sayı biçemi metin öznitelikleri:

NumberFormatter::POSITIVE_PREFIX
Pozitif öneki.
NumberFormatter::POSITIVE_SUFFIX
Pozitif soneki.
NumberFormatter::NEGATIVE_PREFIX
Negatif öneki.
NumberFormatter::NEGATIVE_SUFFIX
Negatif soneki.
NumberFormatter::PADDING_CHARACTER
Dolgu karakteri.
NumberFormatter::CURRENCY_CODE
ISO para birimi.
NumberFormatter::DEFAULT_RULESET
Öntanımlı kural kümesi. Sadece kurala dayalı biçemleyicilerle kullanılabilir.
NumberFormatter::PUBLIC_RULESETS
Genel kural kümeleri. Sadece kurala dayalı biçemleyicilerle kullanılabilir. Salt okunur bir özniteliktir. Genel kural kümeleri, kural kümesi isimleri noktalı virgüllerle (;) ayrılarak tek bir dizge halinde gönderilir.

numfmt_get_attribute() ve numfmt_set_attribute() işlevleri tarafından NumberFormatter::ROUNDING_MODE özniteliği ile kullanılan yuvarlama kipi değerleri.

NumberFormatter::ROUND_CEILING
Pozitif sonsuza yuvarlama kipi.
NumberFormatter::ROUND_DOWN
Sıfıra yuvarlama kipi.
NumberFormatter::ROUND_FLOOR
Negatif sonsuza yuvarlama kipi.
NumberFormatter::ROUND_HALFDOWN
İki komşuya da eşit uzaklıkta olmamak koşuluyla aşağı yuvarlama kipi.
NumberFormatter::ROUND_HALFEVEN
İki komşuya da eşit uzaklıkta olmamak koşuluyla çift sayılı komşuya yuvarlama kipi.
NumberFormatter::ROUND_HALFUP
İki komşuya da eşit uzaklıkta olmamak koşuluyla yukarı yuvarlama kipi.
NumberFormatter::ROUND_UP
Sıfırdan öteye yuvarlama kipi.

numfmt_get_attribute() ve numfmt_set_attribute() işlevleri tarafından NumberFormatter::PADDING_POSITION özniteliği ile birlikte kullanılan dolgu konumu değerleri:

NumberFormatter::PAD_AFTER_PREFIX
Dolgu karakterlerini önekten sonra yerleştir.
NumberFormatter::PAD_AFTER_SUFFIX
Dolgu karakterlerini sonekten sonra yerleştir.
NumberFormatter::PAD_BEFORE_PREFIX
Dolgu karakterlerini önekten önce yerleştir.
NumberFormatter::PAD_BEFORE_SUFFIX
Dolgu karakterlerini sonekten önce yerleştir.

İçindekiler

add a note

User Contributed Notes 9 notes

up
48
giorgio dot liscio at email dot it
13 years ago
this class seems to be painful: it is not, formatting and parsing are highly customizable, but what you probably need is really simple:

if you want to localize a number use:

<?php
$a
= new \NumberFormatter("it-IT", \NumberFormatter::DECIMAL);
echo
$a->format(12345.12345) . "<br>"; // outputs 12.345,12
$a->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 0);
$a->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 100); // by default some locales got max 2 fraction digits, that is probably not what you want
echo $a->format(12345.12345) . "<br>"; // outputs 12.345,12345
?>

if you want to print money use:

<?php
$a
= new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
echo
$a->format(12345.12345) . "<br>"; // outputs €12.345,12
?>

if you have money data stored as (for example) US dollars and you want to print them using the it-IT notation, you need to use

<?php
$a
= new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
echo
$a->formatCurrency(12345, "USD") . "<br>"; // outputs $ 12.345,00 and it is formatted using the italian notation (comma as decimal separator)
?>

another useful example about currency (how to obtain the currency name by a locale string):

<?php
$frontEndFormatter
= new \NumberFormatter("it-IT", \NumberFormatter::CURRENCY);
$adminFormatter = new \NumberFormatter("en-US", \NumberFormatter::CURRENCY);
$symbol = $adminFormatter->getSymbol(\NumberFormatter::INTL_CURRENCY_SYMBOL); // got USD
echo $frontEndFormatter->formatCurrency(12345.12345, $symbol) . "<br>";
?>
up
1
stan at dragnev dot ca
3 years ago
Here's an example of how to use PATTERN_DECIMAL to print a number with two fraction digits, use () for negative numbers and pad to five characters to the left of the decimal point, using spaces as the padding character:

<?php

$fmt
= new NumberFormatter("en-CA", NumberFormatter::PATTERN_DECIMAL, "* #####.00 ;(* #####.00)");
echo
$fmt->format(-45.1);

// Outputs: " (45.10)"

?>

Note that the ; in the pattern denotes the beginning of a subpattern, which is used for negative numbers. Hence the brackets around the pattern after the semicolon.
up
0
Einenlum
2 months ago
Be aware that (at least with the locale 'fr-FR') NumberFormatter doesn't use spaces. It doesn't even use non breakable spaces (NBSP). It uses narrow non breakable spaces (NNBSP). This broke my tests.

<?php

$formatter
= new NumberFormatter(
'fr-FR',
NumberFormatter::DEFAULT_STYLE
);

$value = $formatter->format(100_000); // '100 000'

// If you want to replace narrow non breakable spaces with non breakable spaces:

str_replace("\u{202F}", "\u{00A0}", $value);

// If you want to replace it with a normal space

str_replace("\u{202F}", " ", $value);
up
0
gwyneth dot llewelyn at gwynethllewelyn dot net
1 year ago
When using the `NumberFormatter` class for pretty-printing currency in PHP 7.3 and 8+, it's not clear from the documentation that you can use the empty string "" as the locale for the constructor, and that will retrieve the default locale (whatever it has been set to in your environment).

`formatCurrency()`, by contrast, does not accept the empty string for the default currency symbol; it will display a 'generic' currency symbol instead (¤).

Tested with PHP 7.4.30, 8.0.21, 8.1.8 under Ubuntu Linux and 8.1.8 under macOS Big Sur (11.6.8). I tried under other alternatives (e.g. Linux running on ARM chips, PHP 7.3.3) but sadly the `NumberFormatter` library does not seem to be present (or could not be found) on those systems...
up
2
sudheer at binaryvibes dot co dot in
13 years ago
Sample script to print number in English.

<?php
$f
= new NumberFormatter("en", NumberFormatter::SPELLOUT);
echo
$f->format(123456);

?>

Produces the result:
one hundred twenty-three thousand four hundred fifty-six
up
-2
AF
3 years ago
Please pay attention to the Arabic decimal separator (https://en.wikipedia.org/wiki/Decimal_separator#Other_numeral_systems).

All the following conditions are true:
<?php
(new \NumberFormatter("ar_AE", \NumberFormatter::DEFAULT_STYLE))->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL) === '٫';
(new
\NumberFormatter("ar_AE", \NumberFormatter::DEFAULT_STYLE))->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL) == '٫';

(new
\NumberFormatter("ar_AE", \NumberFormatter::DEFAULT_STYLE))->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL) !== ',';
(new
\NumberFormatter("ar_AE", \NumberFormatter::DEFAULT_STYLE))->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL) != ',';
?>
up
-3
Joey
7 years ago
Be warned that this class sometimes lacks sufficient error output. I recently instantiated it while invalid pattern to the constructor.

php -r '$nf = new \NumberFormatter("tlh-KX.UTF8", \NumberFormatter::IGNORE, "{,,#;#}");var_dump($nf->format(5));'

Fatal error: Call to a member function format() on null in Command line code on line 1

Rather than emitting an error message or throwing an exception null is returned after calling new.

I'm not sure if it's fixed in PHP 7 but it's something to watch out for. Make sure you check your parameters very closely.
up
-1
jimbo2150 at gmail dot com
1 year ago
The NumberFormatter class can be used to convert integer numbers to Roman numerals without a custom function using an array of symbols and associated values:

<?php

function intToRomanNumeral(int $num) {
static
$nf = new NumberFormatter('@numbers=roman', NumberFormatter::DECIMAL);
return
$nf->format($num);
}

echo
intToRomanNumeral(2); // II

echo intToRomanNumeral(5); // V

echo intToRomanNumeral(10); // X

echo intToRomanNumeral(50); // L

echo intToRomanNumeral(57); // LVII
echo intToRomanNumeral(58); // LVIII

echo intToRomanNumeral(100); // C

echo intToRomanNumeral(150); // CL

echo intToRomanNumeral(1000); // M

echo intToRomanNumeral(10000); // ↂ

?>
up
-11
Adam
7 years ago
Good to know Numberformatter::SPELLOUT using soft hypens.

So, if you want to avoid it use preg_replace:

<?php
$azaz
= new NumberFormatter("hu-HU", NumberFormatter::SPELLOUT);
$text = preg_replace('~\x{00AD}~u', '', $azaz->format(123456));
print
$text;
?>
Output without preg_replace:
egy-­száz-­huszon-­három-­ezer négy-­száz-­ötven-­hat

Output with preg_replace:
egyszázhuszonháromezer négyszázötvenhat
To Top