[c#] 지수 표기법에서 숫자 구문 분석

문자열 “1.2345E-02″(지수 표기법으로 표현 된 숫자)를 10 진수 데이터 유형으로 구문 분석해야하지만 Decimal.Parse("1.2345E-02")단순히 오류가 발생합니다.



답변

부동 소수점 숫자이므로 다음과 같이 알려야합니다.

decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);


답변

다음을 지정하면 작동합니다 NumberStyles.Float.

decimal x = decimal.Parse("1.2345E-02", NumberStyles.Float);
Console.WriteLine(x); // Prints 0.012345

왜 이것이 기본적으로 지원되지 않는지 잘 모르겠습니다. 기본값은 NumberStyles.NumberAllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint 및 AllowThousands 스타일을 사용하는을 사용하는 것입니다. 성능과 관련이있을 수 있습니다. 지수를 지정하는 것은 비교적 드뭅니다.


답변

NumberStyles를 지정하는 것 외에도 다음과 같은 decimal.TryParse 함수 를 사용하는 것이 좋습니다 .

decimal result;
if( !decimal.TryParse("1.2345E-02", NumberStyles.Any, CultureInfo.InvariantCulture, out result) )
{
     // do something in case it fails?
}

NumberStyles의 대안으로 형식이 확실한 경우 특정 세트를 사용할 수 있습니다. 예 :

NumberStyles.AllowExponent | NumberStyles.Float


답변

decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);


답변

선택한 답변에 대한주의 : 지정하는 subtility이 System.Globalization.NumberStyles.Float을Decimal.Parse A를 초래할 수 System.FormatException ‘.’시스템과 형식의 숫자를 기다리고 될 수 있기 때문에 대신이 ‘,’

예를 들어, 프랑스어 표기법에서 “1.2345E-02″는 유효하지 않습니다. 먼저 “1,2345E-02″로 변환해야합니다.

결론적으로 다음과 같은 내용을 사용하십시오.

Decimal.Parse(valueString.Replace('.',','), System.Globalization.NumberStyles.Float);


답변

를 전달 NumberStyles.Float하면 경우에 따라 문자열이 처리되는 규칙이 변경되어 NumberStyles.Number(에서 사용하는 기본 규칙 decimal.Parse) 과 다른 출력이 생성 되는 것을 발견했습니다 .

예를 들어 다음 코드는 FormatException내 컴퓨터에서 생성합니다 .

CultureInfo culture = new CultureInfo("");
culture.NumberFormat.NumberDecimalDigits = 2;
culture.NumberFormat.NumberDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = ",";
Decimal.Parse("1,234.5", NumberStyles.Float, culture); // FormatException thrown here

NumberStyles.Number | NumberStyles.AllowExponent이것은 지수 숫자를 허용하고 decimal규칙에 따라 문자열을 계속 처리하므로 input을 사용하는 것이 좋습니다 .

CultureInfo culture = new CultureInfo("");
culture.NumberFormat.NumberDecimalDigits = 2;
culture.NumberFormat.NumberDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = ",";
Decimal.Parse("1,234.5",NumberStyles.Number | NumberStyles.AllowExponent, culture); // Does not generate a FormatException

포스터의 질문에 답하려면 정답은 다음과 같아야합니다.

decimal x = decimal.Parse("1.2345E-02", NumberStyles.Number | NumberStyles.AllowExponent);
Console.WriteLine(x);


답변

NumberStyles 사용에 대한 경고.

“6.33E + 03″은 예상대로 6330으로 변환됩니다. 독일어에서 소수점은 쉼표로 표시되지만 6,33E + 03은 633000으로 변환됩니다! 데이터를 생성하는 문화가 알려지지 않았고 데이터를 운영하는 문화와 다를 수 있기 때문에 이것은 내 고객에게 문제입니다. 제 경우에는 항상 과학적 표기법을 사용하므로 구문 분석하기 전에 항상 쉼표를 소수점으로 바꿀 수 있지만 1,234,567과 같은 예쁜 형식의 숫자와 같은 임의의 숫자로 작업하는 경우 해당 접근 방식이 작동하지 않습니다.