부동 소수점 수 구문 분석 : Catch All 알고리즘이 있습니까?
다문화 프로그래밍의 재미있는 부분 중 하나는 숫자 형식입니다.
- 미국인은 10,000.50을 사용합니다.
- 독일인은 10.000,50을 사용합니다.
- 프랑스어 사용 10,000,50
내 첫 번째 접근 방식은 문자열을 가져 와서 구분 기호를 만날 때까지 역방향으로 구문 분석하고 이것을 소수점 구분 기호로 사용하는 것입니다. 여기에는 명백한 결함이 있습니다. 10.000은 10으로 해석됩니다.
또 다른 방법 : 문자열에 숫자가 아닌 2 개의 다른 문자가 포함 된 경우 마지막 문자를 소수점 구분 기호로 사용하고 나머지 문자는 버립니다. 하나만 있으면 두 번 이상 발생하는지 확인하고 발생하면 버립니다. 한 번만 나타나는 경우 뒤에 3 자리가 있는지 확인합니다. 그렇다면 버리고, 그렇지 않으면 소수점 구분 기호로 사용하십시오.
명백한 "최상의 솔루션"은 사용자의 문화 나 브라우저를 감지하는 것이지만 en-US Windows / 브라우저를 사용하는 프랑스 인이있는 경우 작동하지 않습니다.
.net 프레임 워크 Double.(Try)Parse()
에 숫자 형식을 자동 감지하는 것보다 더 나은 신화적인 흑 마법 부동 소수점 파서가 포함되어 있습니까?
이 경우에 할 수있는 최선은 그들의 의견을 받아 들여 그들이 의미한다고 생각하는 것을 보여주는 것입니다. 동의하지 않는 경우 원하는 형식을 보여주고 다시 입력하도록합니다.
문제의 ASP.NET 측면을 모르지만 .NET에는 System.Globalization.CultureInfo 라는 매우 강력한 클래스가 있습니다. 다음 코드를 사용하여 double 값이 포함 된 문자열을 구문 분석 할 수 있습니다.
double d = double.Parse("100.20", CultureInfo.CurrentCulture);
// -- OR --
double d = double.Parse("100.20", CultureInfo.CurrentUICulture);
ASP.NET이 어떻게 든 (즉, HTTP 요청 헤더 사용) 현재 사용자의 CultureInfo를 CultureInfo.CurrentCulture 또는 CultureInfo.CurrentUICulture에 전달하면 제대로 작동합니다.
모두를 기쁘게 할 수는 없습니다. 내가 10을 10.000으로 입력하고 누군가가 10,000을 10.000으로 입력하면 입력 문화에 대한 지식 없이는 처리 할 수 없습니다. 어떻게 든 문화를 감지하거나 (브라우저, 시스템 설정-사용 사례는 무엇입니까? ASP? 내부 앱입니까? 아니면 세계에 개방되어 있습니까?) 예상되는 형식의 예를 제공하고 가능한 가장 관대 한 파서를 사용하십시오. 아마도 다음과 같습니다.
double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
프랑스어와 영어로 된 12.345의 차이는 1000의 요소입니다. 최대 <1000 * min 인 예상 범위를 제공하면 쉽게 추측 할 수 있습니다.
예를 들어 사람의 키 (아기 및 어린이 포함)를 mm 단위로 가정합니다.
200-3000 범위를 사용하면 1.800 또는 1,800의 입력은 1 미터와 80 센티미터로 명확하게 해석 될 수있는 반면, 912.300 또는 912,300의 입력은 91 센티미터와 2.3 밀리미터로 명확하게 해석 될 수 있습니다.
참고 URL : https://stackoverflow.com/questions/192/floating-point-number-parsing-is-there-a-catch-all-algorithm
'Nice programing' 카테고리의 다른 글
PHP에서 정적 및 비 정적 메서드를 선언 할 수 있습니까? (0) | 2020.11.28 |
---|---|
matplotlib 서브 플롯의 행 및 열 헤더 (0) | 2020.11.28 |
1. # INF00, -1. # IND00 및 -1. # IND는 무엇을 의미합니까? (0) | 2020.11.28 |
JUnit 메시지에 성공 또는 실패 조건이 명시되어야합니까? (0) | 2020.11.28 |
프로토 타입과 클로저가있는 객체 지향 자바 스크립트 (0) | 2020.11.28 |