使用区域性信息将逗号十进制值转换为点小数值的最佳方法

时间:2015-11-09 06:44:21

标签: c# .net cultureinfo culture

您好我需要根据文化信息转换小数值。 对于EG

  

如果 en-US 文化,则小数值将类似于 21.56    tr-TR 这是火鸡文化信息,这里相同的值将为 21,56

我的要求是无论小数值是多少,但我需要在en-US中作为默认值。我需要用点分隔我的十进制值,我不想要逗号的十进制值。

我尝试使用以下代码进行转换

                CultureInfo userCulture = new CultureInfo("tr-TR");
                string fromVisioAPI = "35,2083";
                string display = double.Parse(fromDb, userCulture).ToString();

这里的输出是“35.2083”,这是我预期的,但是这里硬编码 tr-TR 值,我不知道有多少文化用相同的逗号和点差异。

This was a normal replacement and i need to be a proper culture conversion

那么使用文化信息将逗号十进制值转换为点小数值的最佳方法是什么?

4 个答案:

答案 0 :(得分:1)

您需要知道要解析的数据的区域性信息。如果这是静态的,您可以简单地对其进行硬编码或在app.config中对其进行配置。 否则,您可以使用CultureInfo.CurrentCulture

要将值转换回字符串,您应该使用具有特定文化信息的ToString重载:

var visioApiCulture = 
    new CultureInfo(ConfigurationManager.AppSettings["VisioApiCulture"]);

var visioApiCulture = CultureInfo.CurrentCulture;

-

string fromVisioApi = "35,2083";

string display = double
    .Parse(fromVisioApi, visioApiCulture)
    .ToString(CultureInfo.InvariantCulture);

答案 1 :(得分:0)

假设Visio API与您的代码在同一台计算机上运行,​​那么Visio正在使用的Windows文化信息很可能与您的程序默认使用的相同。您可以从CultureInfo.CurrentCulture属性获取当前文化:https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentculture(v=vs.110).aspx

答案 2 :(得分:0)

它认为below code可以帮助你......

public double? ConvertStringToDouble(string strDoubleValue)
{
    //Checking null
    if (strDoubleValue == null)
    {
        return null;
    }

    //Making trim
    strDoubleValue = strDoubleValue.Trim();

    //Checking empty
    if (strDoubleValue == string.Empty)
    {
        return null;
    }

    //If the amout treat dot(.) as decimal separator
    if (strDoubleValue.IndexOf('.')!=-1)
    {
        //If multiple . is present then the amount is invaid
        if (strDoubleValue.Count(o=>o=='.')>1)
        {
            return null;
        }

        //removing thousand separators
        //it might not be needed
        strDoubleValue = strDoubleValue.Replace(",", "");

        return ConvertPlainStringToDouble(strDoubleValue);
    }


    //If the amout treat dot(,) as decimal separator
    //then it must not use ',' as thousand separator
    if (strDoubleValue.Count(o => o == ',') > 1)
    {
        //removing thousand separators
        //it might not be needed
        strDoubleValue = strDoubleValue.Replace(",", "");
        return ConvertPlainStringToDouble(strDoubleValue);                
    }

    //Here will be logic that the string contains single comma , is treated here as 
    //deciaml separator or comma separator

    //int charCountBeforeComma = strDoubleValue.IndexOf(',');
    //int charCountAfterComma = strDoubleValue.Length - (charCountBeforeComma + 1);

    ////If charCountAfterComma is not in 3rd position than
    ////the comma cannot be thousand separator example: 458,5896
    //if (charCountAfterComma!=3)
    //{
    //    //removing thousand separators
    //    //it might not be needed
    //    strDoubleValue = strDoubleValue.Replace(",", ".");
    //    return ConvertPlainStringToDouble(strDoubleValue);   
    //}

    //if string having more than 3 char before comma like 4589,548
    //it means no thousand separator used else the amount should represent like this 4,589,548
    //you can use below code 
    //if (charCountBeforeComma>3)
    //{
    //    //removing thousand separators
    //    //it might not be needed
    //    strDoubleValue = strDoubleValue.Replace(",", "");
    //    return ConvertPlainStringToDouble(strDoubleValue);   
    //}

    //if all above missed than i am sorry              
    //it means the string is like 458,458 or 58,458 format
    //you need to put some logical condition here 
    //??????

}

private Double? ConvertPlainStringToDouble(string strPlainDoubleValue)
{            
    Double amount;
    if (Double.TryParse(strPlainDoubleValue, out amount))
    {
        return amount;
    }

    return null;
}

我试图参加所有合乎逻辑的条件来解决这个问题..但最后......还有一些事情 d由你填.. ..)

答案 3 :(得分:0)

您应该在API中使用通用格式属性 - 这些属性不依赖于区域性设置。

例如,要获取单元格的公式,请使用FormulaU - 这将保留.中的所有数字表示小数点,,表示千位分隔符格式。

使用Result也应该有效,因为它应该返回一个double而不是一个字符串 - 如果你得到一个字符串,要么你使用了错误的互操作库,要么你做错了什么。您可以再次使用ResultStrU作为解决方法来获取通用格式字符串。