NumberFormatter sınıfı

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

Giriş

Programlar sayılar üzerinde işlem yapmak ve bunları saklamak için yerelden bağımsız bir ikil gösterim kullanırlar. 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üzdeleri öntanımlı yerele veya belirtilen yerele uygun olarak biçemleyebilirsiniz. NumberFormatter sınıfı yerele duyarlı olduğundan her yerel için yeni bir sayı biçemleyici oluşturmanız 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ünü kullanabilirsiniz. Şü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 belirttiğiniz miktarı görürsünüz. 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

NumberFormatter {
/* Yöntemler */
public __construct(string $yerel, int $tür, string $kalıp = ?)
public static create(string $yerel, int $tür, string $kalıp = ?): NumberFormatter
public formatCurrency(float $değer, string $para_birimi): string|false
public format(int|float $değer, int $tür = ?): string
public getAttribute(int $biçemleyici): int
public getErrorCode(): int
public getErrorMessage(): string
public getLocale(int $tür = ?): string
public getPattern(): string
public getSymbol(int $öznitelik): string
public getTextAttribute(int $öznitelik): string
public parseCurrency(string $değer, string &$dizge, int &$konum = ?): float
public parse(string $değer, int $tür = ?, int &$konum = ?): mixed
public setAttribute(int $öznitelik, int $değer): bool
public setPattern(string $kalıp): bool
public setSymbol(int $öznitelik, 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 (int)
Şablona göre tanımlı ondalık biçem
NumberFormatter::DECIMAL (int)
Ondalık biçem
NumberFormatter::CURRENCY (int)
Para birimi biçemi
NumberFormatter::PERCENT (int)
Yüzde biçemi
NumberFormatter::SCIENTIFIC (int)
Bilimsel sayı gösterim biçemi
NumberFormatter::SPELLOUT (int)
Kurala dayalı heceleme biçemi
NumberFormatter::ORDINAL (int)
Kurala dayalı sıra gösterim biçemi
NumberFormatter::DURATION (int)
Kurala dayalı süre gösterim biçemi
NumberFormatter::PATTERN_RULEBASED (int)
Şablona göre tanımlı kurala dayalı biçem
NumberFormatter::CURRENCY_ACCOUNTING (int)
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 (int)
Yerele özgü öntanımlı biçem
NumberFormatter::IGNORE (int)
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 değiştirgeleri olarak kullanılırlar.

NumberFormatter::TYPE_DEFAULT (int)
Türü değişken türünden türet
NumberFormatter::TYPE_INT32 (int)
32 bitlik tamsayı olarak çözümle/biçemle
NumberFormatter::TYPE_INT64 (int)
64 bitlik tamsayı olarak çözümle/biçemle
NumberFormatter::TYPE_DOUBLE (int)
Bir kayan noktalı sayı olarak çözümle/biçemle
NumberFormatter::TYPE_CURRENCY (int)
Para birimi olarak çözümle/biçemle

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

NumberFormatter::PARSE_INT_ONLY (int)
Sadece tamsayıları çözümle.
NumberFormatter::GROUPING_USED (int)
Gruplama ayracı kullan.
NumberFormatter::DECIMAL_ALWAYS_SHOWN (int)
Ondalık noktayı daima göster.
NumberFormatter::MAX_INTEGER_DIGITS (int)
Azami tamsayı hane sayısı.
NumberFormatter::MIN_INTEGER_DIGITS (int)
Asgari tamsayı hane sayısı.
NumberFormatter::INTEGER_DIGITS (int)
Tamsayı hane sayısı.
NumberFormatter::MAX_FRACTION_DIGITS (int)
Ondalık kısım azami hane sayısı
NumberFormatter::MIN_FRACTION_DIGITS (int)
Ondalık kısım asgari hane sayısı.
NumberFormatter::FRACTION_DIGITS (int)
Ondalık kısım hane sayısı
NumberFormatter::MULTIPLIER (int)
Çarpan.
NumberFormatter::GROUPING_SIZE (int)
Grup genişliği.
NumberFormatter::ROUNDING_MODE (int)
Yuvarlama kipi.
NumberFormatter::ROUNDING_INCREMENT (int)
Yuvarlama artışı.
NumberFormatter::FORMAT_WIDTH (int)
Çıktı biçeminde dolgu genişliği.
NumberFormatter::PADDING_POSITION (int)
Dolgunun konumu. Olası değerler için dolgu konumlama sabitlerine bakınız.
NumberFormatter::SECONDARY_GROUPING_SIZE (int)
İkincil gruplama genişliği.
NumberFormatter::SIGNIFICANT_DIGITS_USED (int)
Kıymetli haneleri kullan.
NumberFormatter::MIN_SIGNIFICANT_DIGITS (int)
Asgari kıymetli hane sayısı.
NumberFormatter::MAX_SIGNIFICANT_DIGITS (int)
Azami kıymetli hane sayısı.
NumberFormatter::LENIENT_PARSE (int)
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 (int)
Pozitif öneki.
NumberFormatter::POSITIVE_SUFFIX (int)
Pozitif soneki.
NumberFormatter::NEGATIVE_PREFIX (int)
Negatif öneki.
NumberFormatter::NEGATIVE_SUFFIX (int)
Negatif soneki.
NumberFormatter::PADDING_CHARACTER (int)
Dolgu karakteri.
NumberFormatter::CURRENCY_CODE (int)
ISO para birimi.
NumberFormatter::DEFAULT_RULESET (int)
Öntanımlı kural kümesi. Sadece kurala dayalı biçemleyicilerle kullanılabilir.
NumberFormatter::PUBLIC_RULESETS (int)
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_symbol() ve numfmt_set_symbol() işlevleri tarafından kullanılan sayı biçemleme simgeleri.

NumberFormatter::DECIMAL_SEPARATOR_SYMBOL (int)
Ondalık ayraç.
NumberFormatter::GROUPING_SEPARATOR_SYMBOL (int)
Gruplama ayracı.
NumberFormatter::PATTERN_SEPARATOR_SYMBOL (int)
Şablon ayracı.
NumberFormatter::PERCENT_SYMBOL (int)
Yüzde imi.
NumberFormatter::ZERO_DIGIT_SYMBOL (int)
Sıfır.
NumberFormatter::DIGIT_SYMBOL (int)
Şablonda bir rakamı ifade eden karakter.
NumberFormatter::MINUS_SIGN_SYMBOL (int)
Eksi imi.
NumberFormatter::PLUS_SIGN_SYMBOL (int)
Artı imi.
NumberFormatter::CURRENCY_SYMBOL (int)
Para birimi simgesi.
NumberFormatter::INTL_CURRENCY_SYMBOL (int)
Uluslararası para birimi simgesi.
NumberFormatter::MONETARY_SEPARATOR_SYMBOL (int)
Para ayracı.
NumberFormatter::EXPONENTIAL_SYMBOL (int)
Üstel imi.
NumberFormatter::PERMILL_SYMBOL (int)
Binde imi.
NumberFormatter::PAD_ESCAPE_SYMBOL (int)
Öncelem dolgu karakteri.
NumberFormatter::INFINITY_SYMBOL (int)
Sonsuz imi.
NumberFormatter::NAN_SYMBOL (int)
Bir-sayı-değil imi.
NumberFormatter::SIGNIFICANT_DIGIT_SYMBOL (int)
Kıymetli hane imi.
NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL (int)
Para gruplama imi.

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 (int)
Pozitif sonsuza yuvarlama kipi.
NumberFormatter::ROUND_DOWN (int)
Sıfıra yuvarlama kipi.
NumberFormatter::ROUND_FLOOR (int)
Negatif sonsuza yuvarlama kipi.
NumberFormatter::ROUND_HALFDOWN (int)
İki komşuya da eşit uzaklıkta olmamak koşuluyla aşağı yuvarlama kipi.
NumberFormatter::ROUND_HALFEVEN (int)
İki komşuya da eşit uzaklıkta olmamak koşuluyla çift sayılı komşuya yuvarlama kipi.
NumberFormatter::ROUND_HALFUP (int)
İki komşuya da eşit uzaklıkta olmamak koşuluyla yukarı yuvarlama kipi.
NumberFormatter::ROUND_UP (int)
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 (int)
Dolgu karakterlerini önekten sonra yerleştir.
NumberFormatter::PAD_AFTER_SUFFIX (int)
Dolgu karakterlerini sonekten sonra yerleştir.
NumberFormatter::PAD_BEFORE_PREFIX (int)
Dolgu karakterlerini önekten önce yerleştir.
NumberFormatter::PAD_BEFORE_SUFFIX (int)
Dolgu karakterlerini sonekten önce yerleştir.

İçindekiler

add a note add a note

User Contributed Notes 6 notes

up
34
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
6
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
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
1
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
0
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
-4
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