已回答 将AE货币价格解析为双倍值时出现问题

帕沙

知名会员
已加入
2020年4月29日
留言内容
64
编程经验
1-3
我有一个将字符串文本解析为双精度值的函数,它适用于除阿联酋以外的几乎所有文化



Function:
public static double Parse(string text, string culture)
        {
              
                return double.Parse(text.Replace(" ", ""), NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,
                   new CultureInfo(culture));
        }


有问题的阿联酋的价值:"د.إ. 259.00"

文化代码:"ar-AE"

异常获取:System.FormatException:'输入字符串的格式不正确。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
不,OP的问题是输入中的货币符号不正确。
是的,我从SO评论和答案中收集了这些信息。 GIGO。

因此,由于这是一个不好的输入问题,所以我认为我将从头开始,从十进制转换为货币字符串,然后再返回。我开始遇到与我没想到的错误相同的错误。我本以为MS至少可以往返生成的内容。花了最后的空格标记来最终使它往返。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+
微软做的很多事情都让我挠头跳伞。包括打破自己的面向对象规则以及未使用的可重用代码。前几天将该枚举主题作为不良设计原则的证明。那只是愚蠢的想法,是的,我同意你的意见
我本以为MS至少可以往返生成的内容。
有时是可以预期的。那是Microsoft为您服务。
 

帕沙

知名会员
已加入
2020年4月29日
留言内容
64
编程经验
1-3
hoo!我知道了!
C#:
var culture = new CultureInfo("ar-AE");
var value = 259.00m;

var s = value.ToString("C", culture);
MessageBox.Show(s);

var flags = NumberStyles.AllowCurrencySymbol |
            NumberStyles.AllowDecimalPoint |
            NumberStyles.AllowThousands |
            NumberStyles.AllowLeadingWhite |
            NumberStyles.AllowTrailingWhite;
var v = decimal.Parse(s, flags, culture);
MessageBox.Show(v.ToString("C", culture));

魔术在第10-11行。
这行得通了!! 1 wohooo :)
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,028
地点
挪威
编程经验
10+
我本以为MS至少可以往返生成的内容。花了最后的空格标记来最终使它往返。
Leading/trailing white depends on culture, for my culture I had to add leading white. It's easier to just use the composite NumberStyles.Currency for currency strings:
C#:
var culture = new CultureInfo("ar-AE");
var value = 259.00m;
var s = value.ToString("C", culture);
value = decimal.Parse(s, NumberStyles.Currency, culture);
当然,如第1篇所述,输入断开时将不起作用。
 
最佳 底部