Comment formater un entier long sous forme de chaîne sans séparateur en Java?

122

Question simple, mais je parie que demander ici sera probablement plus simple que d'essayer de comprendre la documentation pour MessageFormat:

long foo = 12345;
String s = MessageFormat.format("{0}", foo);

La valeur observée est "12 345".

La valeur souhaitée est "12345".

Daniel Fortunov
la source

Réponses:

62

Juste utiliser Long.toString(long foo)

Rob H
la source
12
OuString.valueOf(long)
rsp
6
String.valueOf () appelle Long.toString ()
Peter Lawrey
7
C'est peut-être insignifiant, mais dans ce cas, vous vous fiez à un comportement non documenté de Long.toString (foo). Pour cette raison, je préfère la réponse de Daniel Fortunov.
John K
4
Ce n'est pas sans papiers. Voir download.oracle.com/javase/6/docs/api/java/lang/… .
Rob H
3
OK, mais cette solution n'est pas applicable à la mise en forme des messages dans ResourceBundle. Tuto i18n
Guillaume Husta
332
MessageFormat.format("{0,number,#}", foo);
Daniel Fortunov
la source
1
Merci, j'essayais de le faire avec l'injection de propriétés MessageFormat. Heureusement, il y a plus d'une façon de le faire!
Philihp Buspar
3
je préfère cette façon. car cela me permet de changer le format dans mon fichier de propriétés de langue.
Pascal
2
Solution parfaite! M'a aidé à conserver l'option format / unformat dans les données de référence plutôt qu'au niveau du code - merci! Et comme @SebastianRoth l'a dit - cela aurait dû être la réponse acceptée.
Ofer Lando
9
Je suis en fait surpris de savoir pourquoi les jolies chaînes numériques sont une valeur par défaut et non une chose explicite avec l'API du formateur
humblerookie
1
Cela fonctionne également dans un format de choix si vous citez le motif:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0
1

J'ai eu un peu de mal avec cela en essayant de faire des modèles «du monde réel» avec l'internationalisation, etc. Plus précisément, nous avons besoin d'utiliser un format de «choix» où la sortie dépend des valeurs affichées, et c'est à cela que java.text.ChoiceFormatsert.

Voici un exemple pour y parvenir:

    MessageFormat fmt = new MessageFormat("{0,choice,0#zero!|1#one!|1<{0,number,'#'}|10000<big: {0}}");

    int[] nums = new int[] {
            0,
            1,
            100,
            1000,
            10000,
            100000,
            1000000,
            10000000
    };

    Object[] a = new Object[1];
    for(int num : nums) {
        a[0] = num;
        System.out.println(fmt.format(a));
    }

Cela génère la sortie suivante; J'espère que cela sera utile pour les autres qui essaient d'accomplir les mêmes types de choses:

zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000

Comme vous pouvez le voir, le format "choix" nous permet de choisir le type de format à utiliser en fonction de la valeur transmise à formater. Les petits nombres peuvent être remplacés par du texte (pas d'affichage de la valeur d'origine). Les nombres de taille moyenne sont affichés sans séparateurs de regroupement (sans virgules). Les plus grands nombres incluent à nouveau les virgules. De toute évidence, il s'agit d'un exemple entièrement artificiel pour démontrer la flexibilité de java.text.MessageFormat.

Une note à propos de la citation #dans le format texte: puisque les deux ChoiceFormatet MessageFormatsont utilisés, il y a une collision entre les métacaractères entre les deux. ChoiceFormatutilise #comme métacaractère qui signifie essentiellement "égal" pour que le moteur de formatage sache que, par exemple, dans le cas où 1#one!nous comparons {0}avec 1, et s'ils sont égaux, il utilise ce "choix" particulier.

Mais #a une autre signification MessageFormat, et c'est comme un métacaractère qui a un sens pour DecimalFormat: c'est un métacaractère qui signifie "mettre un nombre ici".

Parce qu'il est enveloppé dans une ChoiceFormatchaîne, le #doit être entre guillemets. Lorsque l' ChoiceFormatanalyse de la chaîne est terminée, ces guillemets sont supprimés lors du passage des sous-formats à MessageFormat(puis à DecimalFormat).

Ainsi, lorsque vous utilisez {0,choice,...}, vous devez citer ces #caractères, et éventuellement d'autres.

Christopher Schultz
la source
0

Le moyen le plus court est

long foo = 12345;
String s = ""+foo;
Peter Lawrey
la source
3
Et, comme toujours, cela s'étend à de new StringBuilder("").append(foo).toString()sorte que ce n'est pas vraiment optimal.
RAnders00
1
@ RAnders00 Il est peu probable que la conversion d'un nombre en une seule chaîne soit l'option la plus optimale, selon le contexte, vous pouvez généralement l'éviter complètement, mais pour le modèle le plus simple que vous puissiez utiliser""+
Peter Lawrey
1
Vous avez raison, mais je voulais juste le souligner car les gens ont toujours tendance à le signaler.
RAnders00
1
@ RAnders00 btw utiliser un format de message est un ordre de grandeur plus cher, et plus compliqué dans ce cas.
Peter Lawrey
Ouais, il faut plutôt utiliser Long.toString()car c'est ce que cette solution utilise de toute façon en arrière-plan :)
RAnders00
-1

Comme alternative String.formatet java.util.Formatterpourrait fonctionner pour vous aussi ...

Frank Grimm
la source
-6

Tu pourrais essayer:

String s = new Long(foo).toString();
mportiz08
la source
8
Création d'objets inutiles. N'utilisez jamais new avec les classes wrapper.
keiki