文字

NumberFormatter::create

numfmt_create

NumberFormatter::__construct

(PHP 5 >= 5.3.0, PECL intl >= 1.0.0)

NumberFormatter::create -- numfmt_create -- NumberFormatter::__constructCreate a number formatter

说明

面向对象风格 (method)

public static NumberFormatter NumberFormatter::create ( string $locale , int $style [, string $pattern ] )

过程化风格

NumberFormatter numfmt_create ( string $locale , int $style [, string $pattern ] )

面向对象风格 (constructor):

public NumberFormatter::__construct ( string $locale , int $style [, string $pattern ] )

Creates a number formatter.

参数

locale

Locale in which the number would be formatted (locale name, e.g. en_CA).

style

Style of the formatting, one of the format style constants. If NumberFormatter::PATTERN_DECIMAL or NumberFormatter::PATTERN_RULEBASED is passed then the number format is opened using the given pattern, which must conform to the syntax described in » ICU DecimalFormat documentation or » ICU RuleBasedNumberFormat documentation, respectively.

pattern

Pattern string if the chosen style requires a pattern.

返回值

Returns NumberFormatter object or FALSE on error.

范例

Example #1 numfmt_create() example

<?php
$fmt 
numfmt_create 'de_DE' NumberFormatter :: DECIMAL  );
echo 
numfmt_format ( $fmt 1234567.891234567890000 ). "\n" ;
$fmt  numfmt_create 'it' NumberFormatter :: SPELLOUT  );
echo 
numfmt_format ( $fmt 1142 ). "\n" ;
?>

Example #2 NumberFormatter::create() example

<?php
$fmt 
= new  NumberFormatter 'de_DE' NumberFormatter :: DECIMAL  );
echo 
$fmt -> format ( 1234567.891234567890000 ). "\n" ;
$fmt  = new  NumberFormatter 'it' NumberFormatter :: SPELLOUT  );
echo 
$fmt -> format ( 1142 ). "\n" ;
?>

以上例程会输出:

1.234.567,891
millicentoquarantadue

参见

  • numfmt_format() - Format a number
  • numfmt_parse() - Parse a number

用户评论:

[#1] daniel dot rhodes at warpasylum dot co dot uk [2011-08-19 08:43:05]

It should be noted that the locale string passed into NumberFormatter's constructor doesn't play with UCA keywords quite as readily as, say, the Collator and IntlDateFormatter classes' constructors.

According to the Unicode spec (http://www.unicode.org/reports/tr35), I should be able to specify a locale of "ja_JP@numbers=jpanfin" which, for spellout mode, should give me Japanese financial (ie. anti-forgery) numerals. When passed into NumberFormatter's constructor, "ja_JP@numbers=jpanfin" doesn't work.

However, when I look at a dump of NumberFormatter::getPattern() for the ja_JP locale, I see that the financial numerals *are* in there (as %financial). Here's how we wrangle them out of the NumberFormatter:

<?php
$number 
1234567890;

$formatter = new NumberFormatter('ja_JP'NumberFormatter::SPELLOUT);

$formatter->setTextAttribute(NumberFormatter::DEFAULT_RULESET"%financial");

echo 
$formatter->format($number);
//above gives [??r?|????????????f????????] (as opposed to [????|?????????????????????]) - bingo!
?>

[#2] F. Poirotte [2009-11-15 08:26:18]

When formatting durations using the NumberFormatter::DURATION type, you may also need to use NumberFormatter::setTextAttribute to get the desired output.

<?php

$fmt 
= new NumberFormatter('en'NumberFormatter::DURATION);
// Outputs: string(7) "3:25:45"
var_dump($fmt->format(12345));

// "%in-numerals" is the default ruleset, so this results in the same as above.
$fmt->setTextAttribute(NumberFormatter::DEFAULT_RULESET"%in-numerals");
// Outputs: string(7) "3:25:45"
var_dump($fmt->format(12345));

$fmt->setTextAttribute(NumberFormatter::DEFAULT_RULESET"%with-words");
// Outputs: string(31) "3 hours, 25 minutes, 45 seconds"
var_dump($fmt->format(12345));

$fmt2 = new NumberFormatter('fr'NumberFormatter::DURATION);
// Outputs: string(7) "12?345"
// See notes below.
var_dump($fmt2->format(12345));

?>


This is a little counter-intuitive because there is not much doc available about the DURATION type.

Also, as far as I can tell, only the English (en) locale has support for the "%in-numerals" & "%with-words" rulesets. Other locales seem to simply format the input as if the DECIMAL type had been used (at least using "fr" or "de" as the target locale).

One way to provide that feature across different locales is to extract the ruleset implicitely used by NumberFormatter::DURATION and adapt it for the locales you're targetting. Use NumberFormatter::getPattern to extract the ruleset.

上一篇: 下一篇: