문자열 "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.Number
AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint 및 AllowThousands 스타일을 사용하는을 사용하는 것입니다. 성능과 관련이있을 수 있습니다. 지수를 지정하는 것은 비교적 드뭅니다.
decimal
로 double
내 코드에서 것은 내가 그것을 기대하는 것처럼, 나를 위해 잘 작동합니다. 하려는 작업, 사용중인 코드 및 결과에 대한 세부 정보 를 제공 할 수 있다면 훨씬 더 쉽게 도울 수 있습니다.
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
선택한 답변에 대한주의 : 지정하는 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과 같은 예쁜 형식의 숫자와 같은 임의의 숫자로 작업하는 경우 해당 접근 방식이 작동하지 않습니다.