2010-01-19 2 views
0

Java에서 문자열으로 포맷 된 십진수에 1000 단위 구분 기호를 추가해야합니다. 그러나, 나는 하지은 수백만 또는 수십억 분리 ... 유지 수의 기존의 소수 부분 만 천 단위 구분을 원하십니까.Java 또는 Groovy printf를 사용하여 문자열에 1000 단위 구분 기호를 추가하는 방법

9 == 9

999.999 == 999.999

9999 == 9999

999999,999.999 == 999999999.999

나는 엄격의 printf를 사용할 필요가 없습니다

하지만 변환 가능한 한 빨리해야합니다.

입출력 형

모두 문자열이어야한다.

감사합니다. 1000 개 단위 구분 항상 쉼표 아닌 사용자의 로케일에 의존하기 때문에이 나타나는

+0

당신은 java.text.DecimalFormat의 봤어? 질문 이후 – vickirk

+0

는 입력 및 출력이 먼저 번호로 문자열을 구문 분석하고 다시 문자열로 포맷 할 경우에 DecimalFormat는 당신이 필요로 사용하지 않는 것, String 형이어야한다는 요구? – ninesided

+1

DecimalFormat을 살펴 보았는데 이것이 효과가 있다고 생각하지 않았습니다. 질문은 아주 구체적이고 아주 이상합니다! –

답변

0

가장 좋은 방법은 지금까지입니다 :

반환 text.replaceFirst (".^(\ D +) (\ d를 {3}) (\ | $)", "$ 1, $ 2 $ 3 ");

+0

이것이 작동하지 않으면 내 예와 같이 슬래시를 벗어나야합니다. – ninesided

2

첫째,이 문제는 간단하지 않습니다. 어떤 경우에는 실제로 문자열 조작을 위해 작성한 코드에 문제가 발생할 수있는 기간이기도합니다.

사용자의 로케일을 기리고 싶다면 좀 더 고려 된 접근 방법이 필요합니다. 반면에이 특정 사례를 고려하고 로케일 설정에 신경 쓰지 않으려면 뭔가 시도 할 수 있습니다 이 같은 :

String s = "99999999.999"; 
s.replaceFirst("^(\\d+)(\\d{3})(\\.|$)", "$1,$2$3"); 
+3

문화적으로 민감하기를 원한다면 "천 단위 구분 기호"가 아니라 "구분 기호 구분 기호"가됩니다. 왜냐하면 일부 동양 문화권에는 3 번째가 아닌 4 번째 숫자가 있기 때문입니다. –

+0

나는 누구의 로케일을 존중하고 싶지 않다. 항상 쉼표 여야하며 항상 미국 영어로 수천 자리라고하는 장소에 있어야합니다. 십진수의 소수 부분이 3이 아니므로 위 정규식에서 문제를 해결할 수 없습니다. 소수 부분을 임의로 길게 설정하는 것이 좋습니다. –

+0

이 정규식은 9999 대신 9999를 반환하는 입력 9999에서는 작동하지 않습니다. FWIW는 테스트 사례입니다. [ "": "9": "9", "98": "98", "987": "987", "987.6": "987.6" "987.65": "987.65", "987.654": "987.6543": "987.6543": "987.6543", "9,876": "9876", "98,765": "98765", "9876,543": "9876543", "9,876.5": "9876.5" "9,876.54": "9876.54", "9,876.543": "9876.543" "98764321978654,321.987654321": "98764321978654321.987654321" ] .each {예상 입력 -> assert expected == input.replaceFirst ("(\\ d {3} \\.)", '$ 1, $ 2') } –

0
def test='6816843541.5432' 
index = test.indexOf('.') 
test = test.substring(0,index - 3) + ',' + test.substring(index-3,test.size()) 
println test 
관련 문제