【问题标题】:Best way to convert decimal or string to currency in C#?在 C# 中将十进制或字符串转换为货币的最佳方法?
【发布时间】:2010-01-19 12:32:29
【问题描述】:

我一直在努力寻找将小数/字符串转换为货币的最佳方法,具体取决于我的选择。

        public static string returnWaluta(string varS, string varSymbol) {
        decimal varD = decimal.Parse(varS);
        if (varSymbol == "EUR") {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR", false);
            return String.Format("{0:c}", varD);
        } else if (varSymbol == "PLN") {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("pl-PL", false);
            return String.Format("{0:c}", varD);
        } else if (varSymbol == "USD") {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false);
            return String.Format("{0:c}", varD);
        } else {
            // Not handled currency
            MessageBox.Show(varSymbol);
            return varS.ToString();
        }
    }
   public static string returnWaluta(decimal varS, string varSymbol) {
        if (varSymbol == "EUR") {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR", false);
            return String.Format("{0:c}", varS);
        } else if (varSymbol == "PLN") {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("pl-PL", false);
            return String.Format("{0:c}", varS);
        } else if (varSymbol == "USD") {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", false);
            return String.Format("{0:c}", varS);
        } else {
            // Not handled currency
            MessageBox.Show(varSymbol);
            return varS.ToString();
        }
   }

这是好的方法还是我可以做得更好?我从 SQL 数据库中获取数据。我得到十进制值和它所在的货币(如欧元、美元、波兰兹罗提)。这似乎可行,但也许有更好的选择?现在也是单线程应用程序,我是在更改 Thread.CurrentThread.CurrentCulture 时进行全局更改还是只是暂时的,直到我从该方法返回?

关于,

疯子

【问题讨论】:

    标签: c# currency


    【解决方案1】:

    您可以将所需的文化作为第一个参数传递给string.Format。这比每次都更改当前线程要好。您可能需要设置某种地图或字典,以便为您制作从货币代码到文化代码的映射 - 这将大大减少此处的代码行数。

    return string.Format(new CultureInfo(map[currencyCode], false), "{0:c}", varD);
    

    或者,如果您根据货币代码存储 CultureInfo 实例的地图,您将拥有以下内容:

    return string.Format(cultureMap[currencyCode], "{0:c}", varD);
    

    【讨论】:

    • +1,不需要在线程上设置CurrentCulture,这样就消除了OP代码中的大量重复。
    • 您可能想要存储实际的 CultureInfo 实例而不是它们的名称。
    • 虽然我们正在重构,但如果您将 CultureInfo 存储在字典中,您可以直接存储 NumberFormatInfo,这可以通过 NumberFormat 属性访问CultureInfo 对象,它也实现了IFormatProvider
    • 谢谢。尽管我暂时将 if/else 留在其中,但效果很好。也许稍后我会创建提到的地图或字典。
    【解决方案2】:
    Convert.ToDecimal()
    

    【讨论】:

      猜你喜欢
      • 2012-12-19
      • 2010-09-10
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 2014-07-26
      • 2022-07-22
      • 2023-03-24
      相关资源
      最近更新 更多