我一直在胡扯如何处理PHP中的货币显示和数学,并且很长一段时间以来一直使用该DECIMAL类型将其存储在MySQL中,并使用money_format()格式化它以在网页上显示.但是,今天我看了一下实际的原型:
string money_format ( string $format , float $number )
Run Code Online (Sandbox Code Playgroud)
我现在有点困惑.所有我被告知的是,避免浮动钱!但这里是基本的格式化函数(比如快五倍),将输入转换为浮点数.number_format()做同样的事.
所以我的问题是:
除非我处理的是分数美分或数万亿美元(而且我都没有处理过),我是否应该关注显示和存储(但从不进行数学计算)货币被抛到浮点数?我是否会接近浮动点不准确的区域改变我的数字?
如果对#1的回答是我确实应该关注,那么为什么这样money_format()构建呢?
我如何获得特定文化的货币模式?
例如:
而不是使用:
string.Format("{0:c}", 345.10)
Run Code Online (Sandbox Code Playgroud)
我想用这个:
string.Format("#.##0,00 €;-#.##0,00 €", 345.10);
Run Code Online (Sandbox Code Playgroud)
但是我如何为我的应用程序需要的每种文化获得模式字符串(如"#.## 0,00€; - #.## 0,00€")?
我不能使用"{0:c}"模式,因为如果用户切换语言,则货币应该相同.
我试图根据他们的Locale获取货币的符号.但它没有返回符号,而是返回代码.我有一个片段:
import java.util.Currency;
import java.util.Locale;
public class CurrencyFormat
{
public void displayCurrencySymbols()
{
Currency currency = Currency.getInstance(Locale.US);
System.out.println("United States: " + currency.getSymbol());
}
public static void main(String[] args)
{
new CurrencyFormat().displayCurrencySymbols();
}
}
Run Code Online (Sandbox Code Playgroud)
对于Locale.US,它给出符号$但是如果我替换
Currency currency = Currency.getInstance(Locale.US);
Run Code Online (Sandbox Code Playgroud)
同
Currency currency = Currency.getInstance(Locale.GERMANY);
Run Code Online (Sandbox Code Playgroud)
然后代替符号,它给出了国家代码.为什么这样以及我们如何获得符号?
编辑:在看了一些答案后,我想清楚设置一些特定的默认本地不是解决方案,因为我需要一次显示所有可用的符号.
例如
Locale.setDefault(Locale.UK);
Run Code Online (Sandbox Code Playgroud)
将给我欧元符号,但对于doller它将给代码而不是doller sign($).
我注意到一些财务api就像条件API用于信用卡处理要求金额作为美分传递,这似乎是一个很好的简化,它让我想知道为什么我不在我的应用程序的任何地方做同样的我目前在我的Java代码中使用数据库NUMERIC无限长度和Postgres和BigDecimal,但我很容易将钱存入美分.
更新对于没有美分的货币,我们可以将问题概括为将货币存储为货币的最小次要单位,因此美元和其他等价货币的美分.
我在SQL Server中有一个money数据类型.如何在查询中将0.00重新格式化为0?
似乎NSNumberFormatter无法将欧元(可能还有其他)货币字符串解析为数字类型.有人可以证明我错了.
我正在尝试使用以下内容从货币字符串中获取数字金额:
NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
NSNumber *currencyNumber = [currencyFormatter numberFromString:currencyString];
Run Code Online (Sandbox Code Playgroud)
这适用于英国和美国的货币金额.它甚至可以处理$和£以及数千个分离器而没有任何问题.
但是,当我使用欧元货币金额(在设置应用程序中将区域格式设置为法国或德国)时,它返回一个空字符串.以下所有字符串都失败:
12,34 €
12,34
12.345,67 €
12.345,67
Run Code Online (Sandbox Code Playgroud)
值得注意的是,这些字符串与使用相应语言环境时NSNumberFormatter的stringFromNumber方法完全匹配.
在设置应用中将区域格式设置为法国,然后在以下代码中将currencyNumber设置为12.34,导致currencyString设置为'12,34€':
NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
NSString *currencyString = [currencyFormatter stringFromNumber:currencyNumber];
Run Code Online (Sandbox Code Playgroud)
显然很容易就欧元问题解决这个问题,但我希望在尽可能多的国家销售这个应用程序,我认为其他语言环境肯定会发生类似的情况.
有人有答案吗?
TIA,Duncan
任何人都知道具有频繁更新的实时货币汇率Web服务(多个分钟.).需要一个我正在构建的小型Android应用程序,因此需要是免费的.
如果有国家代码US,FR(ISO-3166-1 alpha-2国家代码),你怎么弄的地区代码(Locale.US,Locale.FRANCE)做这样的事情:
System.out.println(DecimalFormat.getCurrencyInstance(Locale.US).format(12.34));
System.out.println(DecimalFormat.getCurrencyInstance(Locale.FRANCE).format(12.34));
$12.34
12,34 €
Run Code Online (Sandbox Code Playgroud) 我正在为node.js使用mongoose模式以及express-validator(它具有节点验证器santiziations和验证器).
什么是存储物品价格的好方法?
我现在有
var ItemSchema = new Schema({
name : { type: String, required: true, trim: true }
, price : Number
});
Run Code Online (Sandbox Code Playgroud)
价格是可选的,所以我有:
if ( req.body.price ) {
req.sanitize('price').toFloat();
req.assert('price', 'Enter a price (number only)').isFloat();
}
Run Code Online (Sandbox Code Playgroud)
express-validator给我isNumeric(允许0填充),isDecimal和isInt ...我宁愿只转换为十进制并删除所有字符,所以我总是将42.00插入db.
我想允许他们输入42.00美元,42美元,42美元,42.00美元,只需存储42.00美元.我怎么能做到这一点?并且仍然验证我看到类似于数字的内容,例如,如果他们输入'abc',我想使用req.assert将错误返回到表单.
另外,我认为货币最终会成为一个问题......
更新,我发现这篇文章说以整数美分存储价格,所以4200 https://dba.stackexchange.com/questions/15729/storing-prices-in-sqlite-what-data-type-to-use
当我调用item.price并清理并将输入转换为4200时,我只需要一种方法将4200转换为$ 42.00.
如何使用Swift(macOS)获取相应货币代码的货币符号.
例:
我的代码:
var formatter = NSNumberFormatter()
formatter.currencySymbol = getSymbol(currencyCode)
formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
let number = NSNumber(double: (amount as NSString).doubleValue)
let amountWithSymbol = formatter.stringFromNumber(number)!
Run Code Online (Sandbox Code Playgroud)
getSymbol(_ currencyCode: String) -> String
或者,还有更好的方法?
currency ×10
cocoa ×2
java ×2
locale ×2
c# ×1
format ×1
iphone ×1
localization ×1
macos ×1
money-format ×1
mongoose ×1
node.js ×1
objective-c ×1
php ×1
rate ×1
sql-server ×1
string ×1
swift ×1
web-services ×1