Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C#将十进制或字符串转换为货币的最佳方法?_C#_Currency - Fatal编程技术网

用C#将十进制或字符串转换为货币的最佳方法?

用C#将十进制或字符串转换为货币的最佳方法?,c#,currency,C#,Currency,我一直在努力寻找将十进制/字符串转换为货币的最佳方法,具体取决于我的选择 public static string returnWaluta(string varS, string varSymbol) { decimal varD = decimal.Parse(varS); if (varSymbol == "EUR") { Thread.CurrentThread.CurrentCulture = new Cultur

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

        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时进行全局更改,还是在从方法返回之前只是临时更改

关于,


MadBoy

您可以将所需的区域性作为第一个参数传递给
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
即可,它可以从
CultureInfo
对象上的
NumberFormat
属性访问,并且还实现了
IFormatProvider
。谢谢。虽然我暂时把if/else放在里面了,但效果很好。也许以后我会创建上面提到的地图或字典。
Convert.ToDecimal()