부동 소수점 번호 구문 분석:Catch All 알고리즘이 있습니까?
다문화 프로그래밍의 재미있는 부분 중 하나는 숫자 형식입니다.
- 미국인들은 10,000.50을 사용합니다.
- 독일인들은 10,000,50을 사용합니다.
- 프랑스어는 10000,50을 사용합니다.
저의 첫 번째 접근법은 문자열을 가져와서 구분자를 만날 때까지 역방향으로 구문 분석하여 소수 구분자로 사용하는 것입니다.여기에는 명백한 결함이 있습니다. 10,000은 10으로 해석됩니다.
또 다른 방법은 문자열에 숫자가 아닌 두 개의 문자가 포함되어 있는 경우 마지막 문자를 소수 구분 기호로 사용하고 나머지 문자는 삭제하는 것입니다.하나만 있으면 한 번 이상 발생하는지 확인하고 발생하면 폐기합니다.한 번만 표시되는 경우 그 뒤에 3자리 숫자가 있는지 확인합니다.있으면 삭제하고, 그렇지 않으면 십진수 구분 기호로 사용합니다.
분명한 "최상의 솔루션"은 사용자의 문화나 브라우저를 감지하는 것이지만, 미국 내 Windows/Browser를 사용하는 프랑스인이 있는 경우에는 작동하지 않습니다.
.net Framework에 보다 나은 신화적인 블랙 매직 부동소수점 파서가 포함되어 있습니까?Double.(Try)Parse()
번호 형식을 자동으로 입력하려고 시도하는 것입니까?
이 경우에 당신이 할 수 있는 최선은 그들의 의견을 받아들여 그들이 무엇을 의미한다고 생각하는지 보여주는 것이라고 생각합니다.의견이 일치하지 않으면 원하는 형식을 보여주고 다시 입력하도록 합니다.
문제의 ASP.NET 측면은 모르지만 .NET은 상당히 강력한 클래스를 가지고 있습니다.시스템.세계화.CultureInfo.다음 코드를 사용하여 이중 값을 포함하는 문자열을 구문 분석할 수 있습니다.
double d = double.Parse("100.20", CultureInfo.CurrentCulture);
// -- OR --
double d = double.Parse("100.20", CultureInfo.CurrentUICulture);
ASP.NET이 현재 사용자의 CultureInfo를 CultureInfo로 전달하는 경우(예: HTTP 요청 헤더 사용).현재 문화 또는 문화 정보입니다.현재 UICulture, 이것들은 잘 작동할 것입니다.
모두를 기쁘게 할 수는 없습니다.만약 제가 10을 10,000으로 입력하고, 누군가가 10,000을 10,000으로 입력한다면, 여러분은 입력의 문화에 대한 약간의 지식 없이는 그것을 다룰 수 없습니다.어떻게든 문화를 탐지합니다(브라우저, 시스템 설정 - 사용 사례는 무엇입니까? ASP?내부 앱 또는 세상에 공개?) 또는 예상되는 형식의 예를 제공하고 가능한 한 관대한 파서를 사용합니다.아마도 다음과 같은 것일 것입니다.
double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
프랑스어와 영어의 12.345의 차이는 1000배입니다.예상 범위를 max < 1000*min으로 지정하면 쉽게 추측할 수 있습니다.
mm 단위의 사람(아기 및 어린이 포함)의 키를 예로 들어 보겠습니다.
200-3000 범위를 사용하면 1.800 또는 1,800 입력은 1m 및 80cm로 명확하게 해석될 수 있는 반면 912.300 또는 912,300 입력은 91cm 및 2.3mm로 명확하게 해석될 수 있습니다.
언급URL : https://stackoverflow.com/questions/192/floating-point-number-parsing-is-there-a-catch-all-algorithm
'programing' 카테고리의 다른 글
여러 테스트에 대한 Unit test setUp/tearDown (0) | 2023.06.09 |
---|---|
임베디드 프로젝트용 C/C++ HTTP 클라이언트 라이브러리 (0) | 2023.06.09 |
병합되지 않은 Git 분기를 찾으십니까? (0) | 2023.06.09 |
'as const'를 유형과 결합하시겠습니까? (0) | 2023.06.09 |
Oracle 정규식에서 탐욕스럽지 않은 정량자가 작동하지 않는 이유는 무엇입니까? (0) | 2023.06.09 |