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 function __construct(string $yerel, int $tür, ?string $kalıp = null)
public static function create(string $yerel, int $tür, ?string $kalıp = null): ?NumberFormatter
public function format(int|float $sayı, int $tür = NumberFormatter::TYPE_DEFAULT): string|false
public function formatCurrency(float $miktar, string $para_birimi): string|false
public function getAttribute(int $öznitelik): int|float|false
public function getErrorCode(): int
public function getErrorMessage(): string
public function getLocale(int $tür = ULOC_ACTUAL_LOCALE): string|false
public function getPattern(): string|false
public function getSymbol(int $simge): string|false
public function getTextAttribute(int $öznitelik): string|false
public function parse(string $dizge, int $tür = NumberFormatter::TYPE_DOUBLE, int &$konum = null): int|float|false
public function parseCurrency(string $dizge, string &$para_simgesi, int &$konum = null): float|false
public function setAttribute(int $öznitelik, int|float $değer): bool
public function setPattern(string $kalıp): bool
public function setSymbol(int $simge, string $değer): bool
public function setTextAttribute(int $öznitelik, string $değer): bool
}

Öntanımlı Sabitler

Biçem Türleri

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

Sayı Biçemi Belirteçleri

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

Sayı Biçemi Öznitelikleri

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.

Sayı Biçemi Metin Öznitelikleri

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.

Yuvarlama Kipleri

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.

Dolgu Belirteçleri

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 5 notes

up
50
giorgio dot liscio at email dot it
15 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
8
jimbo2150 at gmail dot com
3 years 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
3
stan at dragnev dot ca
5 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
3
sudheer at binaryvibes dot co dot in
15 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
0
Einenlum
2 years 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);