[C#] 소수점이있는 문자열을 두 배로 구문 분석하는 방법은 무엇입니까?

"3.5"더블 과 같은 문자열을 구문 분석하고 싶습니다 . 하나,

double.Parse("3.5") 

수율 35와

double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint) 

을 던졌습니다 FormatException.

이제 내 컴퓨터의 로케일이 독일어로 설정되어 있으며 쉼표는 소수점 구분 기호로 사용됩니다. 그것은 그것으로 뭔가를해야 할 수도 있고 입력으로 double.Parse()기대 "3,5"하지만 확실하지 않습니다.

현재 로케일에 지정된대로 형식화되거나 형식화되지 않은 10 진수를 포함하는 문자열을 구문 분석하려면 어떻게해야합니까?



답변

double.Parse("3.5", CultureInfo.InvariantCulture)


답변

나는 일반적으로 다중 문화권 함수를 사용하여 사용자 입력을 구문 분석합니다. 주로 누군가가 숫자 키패드에 익숙하고 쉼표를 소수점 구분 기호로 사용하는 문화권을 사용하는 경우 해당 사람은 쉼표 대신 숫자 패드의 포인트를 사용하기 때문입니다.

public static double GetDouble(string value, double defaultValue)
{
    double result;

    //Try parsing in the current culture
    if (!double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.CurrentCulture, out result) &&
        //Then try in US english
        !double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out result) &&
        //Then in neutral language
        !double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture, out result))
    {
        result = defaultValue;
    }

    return result;
}

그러나 @nikie 의견은 사실입니다. 방어를 위해 문화가 en-US, en-CA 또는 fr-CA 일 수 있다는 것을 알고있는 통제 된 환경에서이 기능을 사용합니다. 프랑스어에서는 쉼표를 소수점 구분 기호로 사용하기 때문에이 기능을 사용하지만 재무 분야에서 일한 사람은 항상 숫자 키패드에서 소수점 구분 기호를 사용하지만이 점은 쉼표가 아닌 점입니다. 따라서 fr-CA 문화에서도 소수점 구분 기호가 될 숫자를 구문 분석해야합니다.


답변

나는 의견을 쓸 수 없으므로 여기에 씁니다.

double.Parse ( “3.5”, CultureInfo.InvariantCulture) 는 좋은 생각이 아닙니다. 캐나다에서는 3.5 대신 3,5를 쓰고이 함수는 결과적으로 35를줍니다.

내 컴퓨터에서 두 가지를 모두 테스트했습니다.

double.Parse("3.5", CultureInfo.InvariantCulture) --> 3.5 OK
double.Parse("3,5", CultureInfo.InvariantCulture) --> 35 not OK

이것이 Pierre-Alain Vigeant가 언급 한 올바른 방법입니다

public static double GetDouble(string value, double defaultValue)
{
    double result;

    // Try parsing in the current culture
    if (!double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.CurrentCulture, out result) &&
        // Then try in US english
        !double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out result) &&
        // Then in neutral language
        !double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture, out result))
    {
        result = defaultValue;
    }
    return result;
}


답변

Double.Parse("3,5".Replace(',', '.'), CultureInfo.InvariantCulture)

구문 분석하기 전에 쉼표를 점으로 바꾸십시오. 소수점 구분 기호로 쉼표가있는 국가에서 유용합니다. 사용자 입력 (필요한 경우)을 하나의 쉼표 나 점으로 제한하는 것을 고려하십시오.


답변

비결은 문화를 사용하여 모든 문화권에서 점을 파싱하는 것입니다.

double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.NumberFormatInfo.InvariantInfo);


답변

상수 문자열로 문자열 대체를 제안하는 위의 모든 대답은 잘못 될 수 있습니다. 왜? Windows의 지역 설정을 존중하지 않기 때문에! Windows는 사용자가 원하는 구분 문자를 자유롭게 설정할 수 있도록합니다. S / He는 제어판을 열고 지역 패널로 이동하여 고급을 클릭하고 언제든지 캐릭터를 변경할 수 있습니다. 프로그램 실행 중에도. 이것을 생각하십시오. 좋은 해결책은 이것을 알고 있어야합니다.

따라서 먼저이 숫자의 출처를 파싱 할 것인지 스스로에게 물어봐야합니다. .NET Framework의 입력에서 오는 경우 동일한 형식이므로 문제가 없습니다. 그러나 외부에서, 외부 서버에서, 아마도 문자열 속성 만 지원하는 오래된 DB에서 온 것일 수 있습니다. 여기서 db 관리자는 숫자를 저장하는 형식의 규칙을 제공해야합니다. 예를 들어 미국 형식의 미국 DB가 될 것임을 알고 있다면 다음 코드를 사용할 수 있습니다.

CultureInfo usCulture = new CultureInfo("en-US");
NumberFormatInfo dbNumberFormat = usCulture.NumberFormat;
decimal number = decimal.Parse(db.numberString, dbNumberFormat);

이것은 세계 어느 곳에서나 잘 작동합니다. 그리고 ‘Convert.ToXxxx’를 사용하지 마십시오. ‘Convert’클래스는 모든 방향의 전환을위한 기반으로 만 생각됩니다. 게다가 : DateTimes에도 비슷한 메커니즘을 사용할 수 있습니다.


답변

string testString1 = "2,457";
string testString2 = "2.457";
double testNum = 0.5;
char decimalSepparator;
decimalSepparator = testNum.ToString()[1];

Console.WriteLine(double.Parse(testString1.Replace('.', decimalSepparator).Replace(',', decimalSepparator)));
Console.WriteLine(double.Parse(testString2.Replace('.', decimalSepparator).Replace(',', decimalSepparator)));