String.format (%s, %d) für Nummern

uberl

Mitglied
Ich habe gesehen, dass ein String.format("%d", 1) von der eingestellten Locale abhängt - ein String.format("%s", 1) nicht.

Sollte man daher %s für Nummern verwenden, wenn die Locale irgendwo geändert werden kann ?

Wie lässt sich dann eine Nummer formattieren, OHNE Einfluss der Locale ?
 
Aber das ist doch ein Vorteil oder?

Ich möchte, dass meine Zahlen in meiner Local formatiert werden.
 
Java:
String.format(Locale.GERMANY,"%d",1);

%s verwendet man für Zeichenketten ;-)

[edit]
Ich möchte, dass meine Zahlen in meiner Local formatiert werden.
Nicht immer. Wenn man z.B. damit einen SQLQuery so zusammenbaut, möchte man in so manch einem Fall keine Deutsche formatterung, da es sonst kracht. [/edit]
 
>>> Nicht immer. Wenn man z.B. damit einen SQLQuery so zusammenbaut, möchte man in so manch einem Fall keine Deutsche formatterung, da es sonst kracht.

Genau !

Aber es spricht nichts gegen String.format("%s", 1) ?
 
Wobei das nur ein Beispiel war. Wenn man kann, sollte man lieber Prepared Statements verwenden ;-)

Aber es spricht nichts gegen String.format("%s", 1)
Ja und nein. Es ist so sinnvoll wie folgendes:
Java:
String alter="1";
Ich würde schon darauf achten, dass der Typ passt. Wenn du dir das angewöhnst und in andere Sprachen übernimmst, kann es sein, dass es kracht (c++ ist da afair strenger).

NAAAIIIINNNN!!!!
Wenn man eine SQL-Query zusammen baut möchte man Bind-Parameter verwenden, sonst haut einen der SQL-Injektor!
Ich dachte mir schon, dass das kommt. Du weißt was ein Beispiel ist ;-)? Naja, dass es keine gute Idee ist, hab ich in diesem Post auch nochmal im ersten Satz geschrieben.
 
Ich möchte nur nicht immer die Locale mit angeben müssen, wenn ich einen String erzeugen will, welcher die Zahl "1" immer unabhängig von ihrer Locale darstellen soll. Daher muss ich doch String.format("%s", 1) verwenden ?
 
Aber es spricht nichts gegen String.format("%s", 1) ?
Nein, dagegen spricht überhaupt nichts. Aber es wird ja eine Darstellung geben, die Du Dir wünschst. Um bei dem Beispiel Query-String zu bleiben wäre das die englische Darstellung und da kann man ja die entspr. Locale so mitgeben.
 
Einen String in einen int verwandeln? [c]Integer.parseInt(String)[/c]
Einen String in einen Integer verwandeln? [c]Integer.valueOf(String)[/c]
Edit: int in String? [c]String.valueOf(int)[/c]
 
Ist das für so einen Fall die gängige Vorgansweise in Java ? (Komme von C)
Bei Umwandlung von Strings in andere Datentypen und umgekehrt würde ich bei technischen Parametern eher andere Methoden verwenden (z.B. siehe auch faetzminator's letzter Post). Vielfach bieten die Frameworks auch entsprechende transparente Konversionen an. PreparedStatement ist ein Beispiel solch einer transparenten Konversion. Du setzt programmatisch einen int und ein SQL-String wird an die DB gesendet. Ähnliches gibt es auch in Web-Frameworks für die Konversion von Request-Parametern.

Bleibt noch die Anzeige auf einer GUI oder in Logs. Da würde ich im Zweifel die Locale explizit setzen.
 
Bei einem

Java:
String.format("%d", 1)

gibt es ja das Problem, dass wenn irgendwer die Locale global umsetzt, dann würde der String nicht mehr passen.
 
Log ja, GUI nein.

Ich bin ja der Meinung, dass das OS aus einem bestimmten Grund auf ein bestimmtes Locale eingestellt ist.

Aber vielleicht interpretiere ich da einfach zu viel hinein...
Ja, bei GUI eher nicht. Wollte es aber nicht gänzlich ausschließen. Habe deswegen auch "im Zweifel" geschrieben.
 
zb. eine Reihe von IP-Adressen, welche dann in einer Schleife für Requests verwendet werden:
192.168.0.10 ... 192.168.0.20

Java:
for(int i=10; i<20; i++) {
   String ip = String.format("192.168.0.%s", i);
   //...
}
 
Ich nehme an, dass dies Java dann implizit macht (bzw auch ein toString()), wenn ich String.format("%s", 1) aufrufe

Kann sein. Trotzdem ist dies nicht der gängige Weg. Conversion hat einfach absolut nichts mit Locale-spezifischer Darstellung zu tun. Dementsprechend kann höchstwarscheinlich [c]Integer.valueOf()[/c] auch kein [c]1,2[/c] parsen - weiss ich aber nicht im Detail (weil wir aus der CH '.' statt ',' als Dezimaltrennzeichen verwenden, was in den Programmiersprachen auch dem normalen Trennzeichen entspricht).

Edit: Randanmerkung zu [c]String.format()[/c] -> noch nie benutzt in 7 Jahren Java.
 
@TO: Wo hast du den da Probleme? Integers sind afaik unabhängig von den Spracheinstellungen. Einen Unterschied macht wohl eher folgendes:
[c]String.format("var alpha=%f;",10.5);[/c]
Das könnte z.b. aus einem Script kommen, dass du rennen lassen willst (um mal vom SQL wegzukommen). Da wäre es erforderlich, das Local.ENGLISH zu setzen.
 
zb. eine Reihe von IP-Adressen, welche dann in einer Schleife für Requests verwendet werden:
192.168.0.10 ... 192.168.0.20

Java:
for(int i=10; i<20; i++) {
   String ip = String.format("192.168.0.%s", i);
   //...
}
Naja, da stellt sich dass Locale-Problem ja eigentlich nicht...
Aber wenn Du sowieso echte Netzwerkzugriffe vor hast könntest Du auch das nehmen:
http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getByAddress(byte[])

bye
TT
 
Dann stelle ich meine Frage nochmal: Welche Anforderung verlangt, dass die Zahl unabhängig vom Locale formatiert wird? Gibt's da 'nen harten Business-Case oder sieht das nur besser aus?

aber im Falle von:

Java:
for(int i=10; i<20; i++) {
   String ip = String.format("192.168.0.%d", i);
   //...
}

gibt es das Problem.

Wir sprechen hier immer noch von einer Conversion von 4 byte (bzw. short / int) in eine IP. Hat immer noch nichts mit einer Locale zu tun.
Was ist nun dein tatsächliches Business Case?
 
Ich habe erfahren, dass ich mit String.format("192.168.0.%d", 1) aufpassen muss, welche Locale gesetzt ist, damit der erzeugte String auch wirklich die "1" darstellt (verwende ich zB Locale("hi", "IN") dann kommt mir die "1" in der anderen Sprache raus und ich kann den resultieren String dann nicht mehr verwenden)

Daher möchte ich gerne erfahren, ob es hier in JAVA eine Best-Practice gibt.

Ich kann ja auch noch einfach Concat nehmen: "192.168.0." + 1
 
Tatsächlich:
Java:
String.format(new Locale("hi","IN"), "%d", 1)
damit hab ich auf der Console ein [c]?[/c]

Ich kann ja auch noch einfach Concat nehmen: "192.168.0." + 1

So würde ich es lösen. In Java habe ich afair nie ein String.format genutzt (wohingegen ich es in C++ intensiver nutze)

@Timothy Truckle: Ich bin mir nicht sicher, ob das Beispiel mit der IP tatsächlich der Anwendungsfall war ;-).
 
könnte sein, muss aber nicht. Da steht ein zb ("zum Beispiel") davor. Aber darüber zu streiten macht wenig Sinn, die Antwort kennt nur der TO 😉.
 

Neue Themen


Zurück
Oben