2017-03-14 1 views
1

C++ 프로그램에서 ICU를 사용하여 십진수 값의 다양한 로케일 및 응용 프로그램 특정 표현이 포함될 수있는 텍스트의 십진수 값을 구문 분석합니다. 코드의 첫 번째 레이어는 정규 표현식을 적용하여 텍스트의 관련 부분을 확대 한 다음이 경우 10 진수 값이 포함 된 문자열의 서식을 해제해야합니다.소수 구분 기호가 콜론 인 숫자의 문자열 표현을 구문 분석하는 방법 :

구성에서 적용 할 로케일 (예 : "en", "sv") 및 ICU 10 진수 형식을 설정할 수 있습니다. . 예, "EN"과 형식 ###의 경우, ### ## 코드를 다음과 같이 영어 (미국)의 스타일 번호 "123,456.70"을 구문 분석 (오류가 생략 핸들링) :

UErrorCode error = U_ZERO_ERROR; 
icu::Formattable binvalue(0.0); 
icu::Locale iculocale(locale_as_string); // e.g "sv", "en" 
icu::DecimalFormatSymbols symbols(iculocale, error); 
icu::DecimalFormat format(pattern, symbols, error); // pattern as "###,###.##" 
format.parse(value, binvalue, error); 

지금 내가 입력 문자열을 구문 분석 할 필요가 123 : 70에는 분명히 사용자 지정 형식이 있습니다. 파일을 생성하는 응용 프로그램을 제어 할 권한이 없습니다. 입력 문서의 로케일은 "sv"(스웨덴어)이지만 중요하지는 않습니다.

###, ### ':'##과 같은 로케일과 ICU 숫자 패턴을 지정하여이 작업을 수행 할 수 있습니까? (이는 분명히 잘못된 예입니다). 내 응용 프로그램의 UI에서 (지금은) 패턴과 로케일 만 설정할 수 있습니다. 그래서 DecimalFormatSymbols를 사용자 정의 할 방법이 없습니다.

불행하게도 나는 한마디로 DecimalFormat

이외의 ICU의 진수 형식에 대해 읽고 많은 흥미를하지 않습니다, 나는 패턴 문자열을 통해 소수 구분을 무시할 수 있습니까? "123 : 70"을 구문 분석하고 십진수 값 123.7을 반환하는 패턴 및 로캘 조합이 있습니까?

+0

###로 계속 숫자의 길이를 의미? –

+0

프로그래밍에서 내가 한 모든 것은 단지 데이터를 이동/다시 포맷하는 것입니다. 그렇다면 단순히 문자열을 ":"로 바꾸지 않으시겠습니까? –

+0

예. 그러나 필자는 스크립팅이 필요없는 반 기술 사용자가 일치 및 비공식 규칙을 설정할 수있는 솔루션을 만들고 있습니다. 정규 표현식을 알고 값의 형식을 지정할 수 있다면 좋은 결과를 얻을 수 있습니다. 필자는이를 위해 룰셋 편집기의 형식 (및 사용자 인터페이스)을 확장하고 싶지 않았습니다. 비록 어쨌든 그것을 할 필요가 있습니다. –

답변

0

심볼 객체의 메소드는 setSymbol이며, 아마도 전화를 걸고 싶어합니다.

symbols.setSymbol(icu::DecimalFormatSymbols::kDecimalSeparatorSymbol, ':'); 

형식 문자열이 특정 로케일되지 않은, 그래서 당신은 패턴 ###,###.##

+0

이것은 물론 작동 할 것입니다. 저는 방금 추가 매개 변수 (사용자 정의 십진수 구분 기호)를 UI 및 구성 형식에 추가하는 것을 피하기위한 방법을 찾고있었습니다. 패턴 - 이미 UI에 있습니다. 그러나 형식은 로케일 독립적입니다. 그래서 "기호"를 구성하는 방법을 추가해야합니다. 감사. –

관련 문제