【问题标题】:How to properly remove display currencies in different cultures and remove trailing zeros?如何正确删除不同文化中的显示货币并删除尾随零?
【发布时间】:2014-07-19 16:24:05
【问题描述】:

场景:

第 1 步: 获取十进制值
第 2 步: 使用文化信息显示正确的货币
第 3 步: 结果:

“$100.0000”
“24.0340 英镑”
“11,0400 欧元”

第 4 步: 对 £ 和 $ 使用 trimend,其中符号在数字之前:

    input = input.TrimEnd("0".ToCharArray());
    input = input.TrimEnd(".".ToCharArray());

输出:
“100 美元”
“24.034 英镑”
“11,0400 欧元”

如果最后是零或点,这很简单,但是当其他字符在末尾时,它会中断,以防€文化。

在不进行字符串操作的复杂工作的情况下,从不同字符串中删除尾随零的最佳方法是什么?这甚至是我这样做的正确方式吗?

【问题讨论】:

  • 原来的十进制值怎么了?
  • 先去掉两端的货币符号,然后去掉两端的空格,再去掉右边的小数。您不能一次完成所有这些,只能一步一步地完成。
  • 或者您可以在第一步中去除任何非数值,甚至使用正则表达式提取数值,不包括尾随零。
  • 简单地删除所有尾随零似乎并不正确。例如,“$100.5000”应更改为“$100.50”,而不是“$100.5”。
  • @MichaelLiu "$100.5" 非常罕见,但你凭什么逻辑可以说它不正确?

标签: c#


【解决方案1】:

使用 CurrencySymbol 获取当前货币:

Char currentCurrency = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol.ToCharArray()[0];

// Get your Double number,
Double result = null;

try {
    Regex regexObj = new Regex(@"[^\d]");
    result = Convert.ToDouble(regexObj.Replace(input, ""));
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

Switch(currentCurrency){
  // Append or prepend your currency symbol to your input
}

如果您需要更改线程货币,请使用此代码获取当前线程货币符号:

System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol

来源: Link 1, Link 2

【讨论】:

    【解决方案2】:

    问题是你不能使用 NumberFormatInfo 类来获得正确的文化对象,同时跟踪零......所以如果你想实现我所需要的,你必须对字符串进行一些操作。

    我想要的输出:

    “10.2 美元”
    “50.465 英镑”
    “23,54 欧元”

    按照本地编写货币的标准。

    我解决了复杂的字符串操作(也就是一些关于字符串的工作)...

    public static string LocalizeJackpots(this HtmlHelper html, decimal amount, byte currencyType)
    {
        var httpContext = new HttpContextWrapper(HttpContext.Current);
    
        string countryCulture = httpContext.Request.Cookies["countryCulture"].Value;
    
        var culture = GetCultureByCurrencyType(currencyType, countryCulture);
    
        return ManipulateCurrencyString(amount.ToString("c", culture));
    }
    

    然后:

    /// <summary>
            /// This is used to properly trail leading zeros with usage of NumberFormatInfo culture class later in string
            /// </summary>
            /// <param name="input"></param>
            /// <returns></returns>
    private static string ManipulateCurrencyString(string input)
            {
                char lastCharacter = input.Substring(input.Length - 1, 1)[0];
    
                if (Char.IsNumber(lastCharacter))
                {
                // for currencies with symbol in front
                input = input.TrimEnd("0".ToCharArray()).TrimEnd(".".ToCharArray());
                }
                else
                {
                // for currencies with symbol in the end
                string symbol = input.Substring(input.Length - 1, 1);
                string number = input.Substring(0, input.Length - 2).TrimEnd("0".ToCharArray()).TrimEnd(".".ToCharArray()).TrimEnd(",".ToCharArray());
    
                input = number + " " + symbol;
                }
    
                return input;
            }
    

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2011-05-30
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多