我正在使用PHP NumberFormatter类来打印货币值.
例如:
$cFormatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
$cFormatter->formatCurrency(123, 'USD');
$cFormatter->formatCurrency(123, 'BRL');
$cFormatter->formatCurrency(123, 'GBP');
Run Code Online (Sandbox Code Playgroud)
这工作正常,并按预期分别返回"$123.00","R$123.00" "£123.00.
但负数字印在"会计风格"上,用括号括起来,而不是前导减去" - ".
例如:
$cFormatter->formatCurrency(-456, 'USD');
Run Code Online (Sandbox Code Playgroud)
返回"($456.00)",而我想要"-$456.00".当然有一种简单的方法可以做到这一点?
我可以通过覆盖前缀和后缀删除括号,如下所示:
$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "-");
$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_SUFFIX, "");
Run Code Online (Sandbox Code Playgroud)
但后来我没有货币符号,例如"-456.00".
在设置NEGATIVE_PREFIX属性时,是否需要使用货币符号的转义码?
编辑:我很高兴设置一个不同的区域设置,如果这给了我正在寻找的结果.
编辑2:查看Intl库文档(这是用于实现NumberFormatter的库),以下看起来很有希望:
¤(\ u00A4):前缀或后缀:无货币符号,替换为货币符号.如果加倍,则用国际货币符号代替.如果是三倍,则替换为货币复数名称,例如美国的"美元"或"美元".如果存在于模式中,则使用货币小数分隔符而不是小数分隔符.
但是这个:
$cFormatter->setTextAttribute(NumberFormatter::NEGATIVE_PREFIX, "-¤");
Run Code Online (Sandbox Code Playgroud)
只需打印"-¤123",就没有喜悦.
编辑3:我想我找到了答案,见下文.
我正在使用intl包将我的应用翻译成西班牙语。
locales.dart
class AppLocale {
...
String get folder => Intl.message("Folder", name: 'folder');
...
}
Run Code Online (Sandbox Code Playgroud)
messages_es.dart
class MessageLookup extends MessageLookupByLibrary {
get localeName => 'es';
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function> {
"folder": MessageLookupByLibrary.simpleMessage("Carpeta"),
};
}
Run Code Online (Sandbox Code Playgroud)
我用以下代码称呼它:
AppLocale.of(context).folder
Run Code Online (Sandbox Code Playgroud)
一切正常。
但是,我需要创建“动态”字符串。例如:
“嗨,{$ name}”
然后,我将调用此字符串,并将此“名称”作为参数传递,或类似的内容。西班牙语将其翻译为“ Hola,{$ name}”。
是否可以使用此intl包?
我尝试在Xampp上安装Megento 2(php 7.2.5)并通过安装过程我发现Intl扩展安装错误
我做每一件事情;extension=intl是extension=intl在php.ini
还我复制所有文件icu*.dll从文件xampp/php到xampp/php/ext和xampp/apache/pin目录,当然我重新启动Apache.
还下载MSVCP110.dll并粘贴到C:\Windows\System32
还检查了系统变量中的PHP路径,这没关系.
但直到现在,Intl扩展从未发挥作用
任何帮助?
为了使用Prestashop,我尝试在本地服务器上安装PHP intl扩展。
我添加extension=php_intl.so到etc/php.ini
当我尝试安装Prestashop时,我得到了Intl extension is not loaded。
当我这样做时$ php -m | grep intl,我得到:
PHP Warning: PHP Startup: Unable to load dynamic library
'/usr/local/lib/php/pecl/20160303/php_intl.so' - d
lopen(/usr/local/lib/php/pecl/20160303/php_intl.so, 9): image not found in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/pecl/20160303/php_intl.so' - dlopen
(/usr/local/lib/php/pecl/20160303/php_intl.so, 9): image not found in Unknown on line 0
intl
似乎该文件php_intl.so不存在。 …
Normalizer我在尝试使用该类(特别是该函数)时收到此 PHP 错误Normalizer::normalize:
Fatal error: Class 'Normalizer' not found.
Run Code Online (Sandbox Code Playgroud)
我目前使用的是 PHP 5.3.8,因此根据PHP 文档,它应该默认激活。我唯一能想到的是 PECL intl 扩展的问题。
我检查了php/ext/文件夹,它就php_intl.dll在那里。我检查了php.ini文件,没有extension=php_intl.dll命令,所以我添加了它。但仍然没有运气。除此之外我不知道。有人能告诉我这里到底发生了什么事吗?
谢谢
附加信息:当我运行时phpinfo,没有提及PECL intl 扩展,所以我猜测它没有正确安装。
http://www.tiv.net/2010/12/php-intl-extension-windows-apache.html,卸载 XAMPP 1.77(PECL intl 扩展存在某种内部错误)并安装 XAMPP 1.73。
我的传入日期与此字符串完全相同:
myDate= ' 2017-05-05T12:24:06+0000'
Run Code Online (Sandbox Code Playgroud)
我正在使用“react-intl”中的 FormattedDate 来实现我想要的格式
12:24, 5 May 2017
Run Code Online (Sandbox Code Playgroud)
但是有了这个代码:
<FormattedDate
value={myDate}
day="numeric"
month="long"
year="numeric"
hour="numeric"
minute="numeric"/>
Run Code Online (Sandbox Code Playgroud)
我得到这个:
May 5, 2017, 12:24
Run Code Online (Sandbox Code Playgroud)
我一定做错了什么。或者被误解的文档。你能给我建议吗?
一世
我正在尝试在Docker容器中加载国际PHP扩展,但似乎无法正常工作。
已经尝试过这个https://github.com/docker-library/php/issues/57,但是我仍然收到相同的错误消息:
configure: error: in `/usr/src/php/ext/intl':
configure: error: C++ preprocessor "/lib/cpp" fails sanity check
See `config.log' for more details
Run Code Online (Sandbox Code Playgroud)
我的Docker文件如下所示:
RUN apt-get -y update \
&& apt-get install -y libicu-dev\
&& docker-php-ext-configure intl \
&& docker-php-ext-install intl
Run Code Online (Sandbox Code Playgroud)
它是从php:fpm加载的
有没有人经历过这个问题并解决了这个问题?它让我发疯。
我不明白 NumberFormat 是如何工作的。
在法国,我们从不使用$US,为什么我会得到以下信息?
new Intl.NumberFormat("fr-FR",{
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2,
}).format("345")
"345,00 $US"
new Intl.NumberFormat("fr-FR",{
style: 'currency',
currency: 'EUR',
minimumFractionDigits: 2,
}).format("345")
"345,00 €"
Run Code Online (Sandbox Code Playgroud)
另外:以下对我来说也没有任何意义。我尝试了随机语言环境来查看影响并为这两个获得不同的结果:
new Intl.NumberFormat("en-HOS",{
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2,
}).format("345")
"345,00 $US"
new Intl.NumberFormat("en-HOSSDDG",{
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2,
}).format("345")
"$345.00"
Run Code Online (Sandbox Code Playgroud)
这个 API 是坏的还是我错过了什么?
我正在寻找一种将分钟转换为小时和分钟的方法。我正在使用这个intl包,DateFormat但这需要两者hours,minutes所以它不会。
如果我有100分钟,我希望将其转换为01:40. 谢谢
我正在使用 React Native 开发一个在 IOS 和 Android 上运行的应用程序。我用来Intl.numberformat()打印货币,当应用程序在 IOS 上运行时运行顺利,但在 Android 上运行时出现此错误:ReferenceError: Can't find variable: Intl。
如何让它在两个平台上运行?
intl ×10
php ×5
currency ×2
flutter ×2
android ×1
dart ×1
datetime ×1
docker ×1
javascript ×1
magento ×1
pecl ×1
prestashop ×1
react-native ×1
reactjs ×1
windows-10 ×1
xampp ×1