You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#解析阿联酋(ar-AE)货币金额转Double遇FormatException求助

解决阿联酋文化(ar-AE)下货币金额解析为Double的问题

我来帮你分析这个问题并给出可行的解决方案:

问题根源

你的函数在ar-AE文化下失效,核心原因有两个:

  1. 货币符号位置不匹配:阿联酋文化(ar-AE)默认的货币格式是数字在前,货币符号在后(例如259.00 د.إ.),但你的输入是符号在前(د.إ. 259.00),double.Parse会严格遵循该文化的格式规则,自然无法识别这种逆序格式。
  2. 空格处理顺序错误:你先执行text.Replace(" ", "")把输入变成د.إ.259.00,导致货币符号和数字直接粘连,进一步破坏了可解析的格式结构。

修复后的函数

我们可以通过先移除当前文化的货币符号,再清理剩余空格并解析的方式解决问题,这样既兼容ar-AE的特殊格式,也不会影响其他文化的正常工作:

public static double Parse(string text, string culture) {
    var cultureInfo = new CultureInfo(culture);
    // 移除当前文化的货币符号,并清理前后冗余空格
    string cleanedText = text.Replace(cultureInfo.NumberFormat.CurrencySymbol, "").Trim();
    // 移除剩余的所有空格(处理千分位空格等特殊情况)
    cleanedText = cleanedText.Replace(" ", "");
    
    return double.Parse(
        cleanedText,
        NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,
        cultureInfo
    );
}

方案优势说明

  • 动态适配文化:通过cultureInfo.NumberFormat.CurrencySymbol动态获取当前文化的货币符号(比如ar-AE下就是د.إ.),避免硬编码符号带来的兼容性问题。
  • 兼容多格式输入:不管货币符号在输入的前面还是后面,都能先剥离符号、保留纯净的数字部分,确保符合当前文化的解析规则。
  • 保留原有能力:保留了NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,确保支持带小数位和千分位的金额解析,不影响其他文化的正常使用。

测试验证

针对你的测试输入"د.إ. 259.00"和文化"ar-AE":

  1. 第一步移除货币符号后得到" 259.00",Trim()后变成纯净的"259.00"。
  2. 无剩余空格,直接用ar-AE文化解析,成功得到259.00的Double值。

这个方案也能兼容ar-AE的标准格式(比如"259.00 د.إ."),完全适配你的需求。

内容的提问来源于stack exchange,提问作者user13725155

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:52:34