2010-01-19 8 views
0

En Java, je dois ajouter un séparateur de milliers à un nombre décimal formaté comme Chaîne. Cependant, je veux pas voulez un séparateur de millions ou de milliards ... juste un séparateur de milliers avec la partie fractionnaire existante du nombre préservé.Comment utiliser Java ou Groovy printf pour ajouter le séparateur de milliers à la chaîne

9 == 9

999.999 == 999.999

== 9,999 9999

999999,999.999 == 999999999,999

Je ne ai pas besoin strictement d'utiliser printf, mais la conversion doit être aussi rapide que possible.

Les types d'entrée et de sortie doivent tous deux être Chaîne.

Merci!

+0

Avez-vous regardé java.text.DecimalFormat? – vickirk

+0

Étant donné que la question exigeait que l'entrée et la sortie soient de type Chaîne, l'utilisation de DecimalFormat ne nécessiterait-elle pas d'abord d'analyser la chaîne en un nombre, puis de la reformater en chaîne? – ninesided

+1

J'ai regardé DecimalFormat et je ne pensais pas que cela fonctionnerait pour cela. La question est assez spécifique et assez étrange! –

Répondre

0

La meilleure solution à ce jour est:

retour text.replaceFirst ("^ (\ d +) (\ d {3}) (\ | $)", « $ 1, 2 $ 3 $ ");

+0

cela ne fonctionne pas, vous devez échapper à vos barres obliques comme dans mon exemple – ninesided

2

Tout d'abord, ce problème n'est pas aussi simple qu'il apparaît car le séparateur des milliers n'est pas toujours une virgule et dépend des paramètres régionaux de l'utilisateur. Dans certains cas, il s'agit en fait d'une période, ce qui peut causer des problèmes avec tout code que vous écrivez pour la manipulation de chaînes. Si vous souhaitez honorer les paramètres régionaux de l'utilisateur, une approche plus réfléchie est requise. Par contre, si vous souhaitez simplement prendre en compte ce cas spécifique et ne pas vous soucier des paramètres régionaux, vous pouvez essayer quelque chose. comme ceci:

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

Notez également que si vous voulez être sensible à la culture, ce n'est pas un «séparateur de milliers» mais un «séparateur de groupe», parce que certaines cultures asiatiques ont tous les 4 chiffres plutôt que tous les 3èmes. –

+0

Je ne veux pas honorer les paramètres régionaux de qui que ce soit. Il doit toujours être une virgule et il doit toujours être à l'endroit normalement appelé l'endroit des milliers en anglais américain. Le Regex ci-dessus ne résoudra pas le problème car la partie décimale de la décimale n'est pas garantie à 3. La préférence est que la partie décimale soit arbitrairement longue. –

+0

Cette regex ne fonctionne pas pour l'entrée 9999, qui renvoie 9999 au lieu de 9999. FWIW, voici un test élémentaire: ["": "", "9": "9", "98": "98", "987": "987", "987.6": "987.6" "987,65": "987,65", "987,654": "987,654", "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", ] .Chaque {prévu, entrée -> assert attendu == input.replaceFirst ("(\\ d) (\\ 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 
Questions connexes