지수 표기법에서 숫자 구문 분석


86

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

답변:


173

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

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

49

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

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

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


나는 이것을 이중으로 작동 시키려고 노력하고 있지만 그렇지 않은 것 같습니다. 왜 그럴 수 없는지 모르겠다 ..?
JanT

@JanT : "할 수 없습니다"와 "할 수 없습니다"보다 더 많은 정보가 없으면 더 이상 도움을 드릴 수 없습니다. 나는 당신이 시도한 것과 정확히 무슨 일이 일어 났는지 보여주는 훨씬 더 자세한 새로운 질문을 할 것을 제안합니다.
Jon Skeet

나는 당신의 대답과 같은 코드를 실행하려고했지만 십진수 대신 두 배를 사용했습니다. 그러나 이미 해결 방법을 찾았습니다. 건배
JanT

1
@JanT 해결 방법을 공유 할 수 있다면 좋을 것입니다. 나는 똑같은 문제가 있으며 정보를 사용할 수 있습니다. 감사!
Rick Glimmer 19 년

@RickGlimmer : 그들이 무엇을하려고했는지에 대한 세부 사항을 제공하지 않았기 때문에 당신의 문제가 JanT와 정확히 똑같다는 것을 어떻게 알 수 있는지 잘 모르겠습니다. 교체 decimaldouble내 코드에서 것은 내가 그것을 기대하는 것처럼, 나를 위해 잘 작동합니다. 하려는 작업, 사용중인 코드 및 결과에 대한 세부 정보 를 제공 할 수 있다면 훨씬 더 쉽게 도울 수 있습니다.
Jon Skeet

35

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

1
그러나 Float = AllowLeadingWhite | 때문에 AllowExponent와 함께 Float를 사용할 필요는 없습니다. AllowTrailingWhite | AllowLeadingSign | AllowDecimalPoint | AllowExponent
루카스 Kmoch

@ LukášKmoch 정말 맞아요. 다른 사람 (Any 제외)과 같은 습관의 힘은 포함하지 않습니다. 그래도 추가 수술을 수행하기 위해 아프지 않아야합니다.
Sverrir Sigmundarson

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

8

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

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

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

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

1
당신이 절대적으로 옳습니다. 아무도 왜 그것을 제기하지 않았는지 이해가 안 돼요.
Carles Alcolea

10
Parse
Andriy Kozachuk

3

를 전달 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);

1

NumberStyles 사용에 대한 경고.

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


0

점 (각각 쉼표)을 바꿀 필요는 없습니다. 입력 IFormatProvider를 지정하기 만하면됩니다.

float d = Single.Parse("1.27315", System.Globalization.NumberStyles.Float, new CultureInfo("en-US"));
float d = Single.Parse("1,27315", System.Globalization.NumberStyles.Float, new CultureInfo("de-DE"));

0

지수 값을 확인하고 변환하려면 이것을 사용하십시오.

string val = "1.2345E-02";
double dummy;
bool hasExponential = (val.Contains("E") || val.Contains("e")) && double.TryParse(val, out dummy);
if (hasExponential)
{
    decimal d = decimal.Parse(val, NumberStyles.Float);
}

이것이 누군가를 돕기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.