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

本文关键字:十进制 最佳 方法 转换 信息 区域性 | 更新日期: 2023-09-27 18:21:05

Hi我需要根据区域性信息转换一个十进制值。对于EG

如果en-US区域性,则十进制值将类似于21.56tr 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值进行硬编码,我不知道有多少种文化具有相同的逗号和句点差异。

这是一个正常的替代品,我需要成为一个合适的培养物转化

那么,使用区域性信息将逗号十进制值转换为点十进制值的最佳方法是什么呢。。?

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

您需要知道要解析的数据的区域性信息。如果这是静态的,您可以简单地对其进行硬编码或在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);

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

它认为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由你填写..:)

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

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

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