PDA

View Full Version : [JAVA] Formattazione delle stringhe


franksisca
12-12-2007, 16:32
ragazzi, devo formattare una stringa in questo modo:
X00-Y00\n


ovvero carattere, due cifre, trattino, carattere 2 cifre e poi il simbolo di "accapo", che se non ricordo male si fà \n

pensavo a creare una maschera, oppure a riempire un vettore....ma spero che ci sia qualcosa nelle librerie (che non trovo).....chi mi aiuta???

franksisca
12-12-2007, 16:41
ho trovato in giro per le api (ritrovate :D ) la classe Formatter....credo di non aver capito appieno come funziona, ma ora provo.....comunque se qualcuno ha suggerimenti ;)

andbin
12-12-2007, 16:51
Da Java 5 la classe String (e alcune altre classi di I/O) ha il metodo format() che fa uso internamente di un Formatter (che è la classe che fornisce appunto queste funzionalità di formattazione).

franksisca
12-12-2007, 16:54
Da Java 5 la classe String (e alcune altre classi di I/O) ha il metodo format() che fa uso internamente di un Formatter (che è la classe che fornisce appunto queste funzionalità di formattazione).

infatti, l'ho letto ma non ho ben capito come funziona......cioè, sto provando a farlo funzionare ma non mi và :(

andbin
12-12-2007, 17:06
infatti, l'ho letto ma non ho ben capito come funzionaTe lo scrivo io ma dovrei capire meglio che dati (e tipi) devi mettere. Cioè con cosa parti.

franksisca
12-12-2007, 17:11
allora, la mia situazione è questa:

io devo inviare una stringa così comp'osta(non mi interessa il tipo di dati che la compongono)

Carattere numero numero - carattere numero numero \n

ovvero qualcosa del tipo A12-V75\n (dovrò fare dei controlli sui caratteri, ma non ci riguarda al momento ;) )

ecco, il mio problema è questo:

se io mando A8-B25\n
oppure B3.c27\n voglio che me li corregga in automatico.....speravo che il format delle string mi potesse aiutare, ma mentre lo uso mi assale il dubbio che ciò non sia possibile, spero che tu possa contraddirmi :D

andbin
12-12-2007, 17:19
io devo inviare una stringa così comp'osta(non mi interessa il tipo di dati che la compongono)

Carattere numero numero - carattere numero numero \nOk, ma quello che vorrei capire io è se ad esempio tu parti con l'avere 1 char, 1 int, 1 char, 1 int semplicemente da formattare. In tal caso puoi fare:

String s = String.format ("%c%02d-%c%02d\n", ch1, num1, ch2, num2);

se io mando A8-B25\n
oppure B3.c27\n voglio che me li corregga in automaticoCorreggerli in che modo?? Ad esempio mettendo uno 0 in modo che A8 diventi A08??

Scusa se sono un po' vago ma in genere devo prima capirle le cose ....

franksisca
12-12-2007, 17:23
Ok, ma quello che vorrei capire io è se ad esempio tu parti con l'avere 1 char, 1 int, 1 char, 1 int semplicemente da formattare. In tal caso puoi fare:

String s = String.format ("%c%02d-%c%02d\n", ch1, num1, ch2, num2);

Correggerli in che modo?? Ad esempio mettendo uno 0 in modo che A8 diventi A08??

Scusa se sono un po' vago ma in genere devo prima capirle le cose ....

no, figurati, anzi grazie per la disponibilità, ancora una volta sei gentilissimo.

si intendevo correggerli in quel modo.......purtroppo la stringa la prendo per intero, quindi

String s = String.format ("%c%02d-%c%02d\n", ch1, num1, ch2, num2);
non posso usarlo

andbin
12-12-2007, 17:36
si intendevo correggerli in quel modo.......purtroppo la stringa la prendo per interoQuindi, se ho capito bene, non devi formattare una stringa (comporla) ma verificare se corrisponde ad un determinato "pattern" e magari estrarre i dati e correggerli.

Se è così, allora puoi usare le espressioni regolari, ma bisognerebbe vedere meglio cosa vuoi che sia accettabile o meno. Mi spiego meglio: se ti arriva 789-B25\n, devi correggerlo? (e come?) E se ti arriva A9;C5\n?

franksisca
12-12-2007, 17:37
rettifica, l'ho provato e funziona......o meglio, fa quello che dico io solo se gli passo i 4 vaolri, quindi, a questo punto, mi conviene creare un parser ad hoc e il gioco è fatto :D

p.s.: mi spieghi una cosa, please..

tratto dalle api
%[argument_index$][flags][width][.precision]conversion
mentre tu usi solo %c....allora perchè il primo%c riconosce ch1 e così via gli altri ???

franksisca
12-12-2007, 17:39
Quindi, se ho capito bene, non devi formattare una stringa (comporla) ma verificare se corrisponde ad un determinato "pattern" e magari estrarre i dati e correggerli.
ESATTO!!!!!!

visto, la mia dialetttica migliora ogni giorno di più lol

ehehe....quasi quasi mi butto sulle espressioni regolari....anche se credo che non sia necessario.......mi rispondi alla domanda di prima please :D

andbin
12-12-2007, 17:53
tratto dalle api
%[argument_index$][flags][width][.precision]conversion
mentre tu usi solo %c....allora perchè il primo%c riconosce ch1 e così via gli altri ???Le parti tra [ ] indicate nella sintassi sono opzionali, è invece importante che uno specificatore di formato inizi con % e termini con un carattere che indica il tipo di conversione. Quindi %c indica un carattere (ch1), %02d indica un intero (2 digit con zeri davanti) ecc....

quasi quasi mi butto sulle espressioni regolari....anche se credo che non sia necessario.......No, in effetti non è strettamente necessario usare le espressioni regolari. Basterebbe estrarre i singoli caratteri e verificare se sono ciò che ti aspetti.

banryu79
12-12-2007, 17:58
rettifica, l'ho provato e funziona......o meglio, fa quello che dico io solo se gli passo i 4 vaolri, quindi, a questo punto, mi conviene creare un parser ad hoc e il gioco è fatto :D

p.s.: mi spieghi una cosa, please..

tratto dalle api
%[argument_index$][flags][width][.precision]conversion
mentre tu usi solo %c....allora perchè il primo%c riconosce ch1 e così via gli altri ???

Perchè secondo la documentazione ci sono 3 modi per indicizzare gli argomenti passati:

Argument Index

Format specifiers can reference arguments in three ways:

* Explicit indexing is used when the format specifier contains an argument index. The argument index is a decimal integer indicating the position of the argument in the argument list. The first argument is referenced by "1$", the second by "2$", etc. An argument may be referenced more than once.

For example:

formatter.format("%4$s %3$s %2$s %1$s %4$s %3$s %2$s %1$s",
"a", "b", "c", "d")
// -> "d c b a d c b a"


* Relative indexing is used when the format specifier contains a '<' ('\u003c') flag which causes the argument for the previous format specifier to be re-used. If there is no previous argument, then a MissingFormatArgumentException is thrown.

formatter.format("%s %s %<s %<s", "a", "b", "c", "d")
// -> "a b b b"
// "c" and "d" are ignored because they are not referenced


* Ordinary indexing is used when the format specifier contains neither an argument index nor a '<' flag. Each format specifier which uses ordinary indexing is assigned a sequential implicit index into argument list which is independent of the indices used by explicit or relative indexing.

formatter.format("%s %s %s %s", "a", "b", "c", "d")
// -> "a b c d"


It is possible to have a format string which uses all forms of indexing, for example:

formatter.format("%2$s %s %<s %s", "a", "b", "c", "d")
// -> "b a a b"
// "c" and "d" are ignored because they are not referenced


The maximum number of arguments is limited by the maximum dimension of a Java array as defined by the Java Virtual Machine Specification. If the argument index is does not correspond to an available argument, then a MissingFormatArgumentException is thrown.


Ciao :)

EDIT:
Ops, sorry, nn ho visto il post di Andbin e il mio si è "accavallato" al suo :P

franksisca
12-12-2007, 20:52
grazie ragazzi, gentilissimi come come sempre....se ho problemi vi faccio sapere

franksisca
13-12-2007, 11:44
Quindi %c indica un carattere (ch1), %02d indica un intero (2 digit con zeri davanti) ecc....


l'ecc non riesco a trovare....ovvero, come faccio a riconoscere il tipo???

c=char
d= digit(int o anche il resto dei "numeri"??)

poi ne esistono altri???

andbin
13-12-2007, 11:59
poi ne esistono altri???Sono tutti spiegati molto ben in dettaglio nella documentazione della classe java.util.Formatter.

franksisca
13-12-2007, 12:01
Sono tutti spiegati molto ben in dettaglio nella documentazione della classe java.util.Formatter.

:doh: :doh: :doh: :doh: :doh:

franksisca
13-12-2007, 12:04
eccoli.....'b', 'B' general If the argument arg is null, then the result is "false". If arg is a boolean or Boolean, then the result is the string returned by String.valueOf(). Otherwise, the result is "true".
'h', 'H' general If the argument arg is null, then the result is "null". Otherwise, the result is obtained by invoking Integer.toHexString(arg.hashCode()).
's', 'S' general If the argument arg is null, then the result is "null". If arg implements Formattable, then arg.formatTo is invoked. Otherwise, the result is obtained by invoking arg.toString().
'c', 'C' character The result is a Unicode character
'd' integral The result is formatted as a decimal integer
'o' integral The result is formatted as an octal integer
'x', 'X' integral The result is formatted as a hexadecimal integer
'e', 'E' floating point The result is formatted as a decimal number in computerized scientific notation
'f' floating point The result is formatted as a decimal number
'g', 'G' floating point The result is formatted using computerized scientific notation or decimal format, depending on the precision and the value after rounding.
'a', 'A' floating point The result is formatted as a hexadecimal floating-point number with a significand and an exponent
't', 'T' date/time Prefix for date and time conversion characters. See Date/Time Conversions.
'%' percent The result is a literal '%' ('\u0025')
'n' line separator The result is the platform-specific line separator

banryu79
13-12-2007, 12:40
Cmq ringrazio Andbin perchè anche io, come Franksisca, stavo cercando un sistema per formattare delle coordinate (memorizzate come double risultati di calcoli trigonometrici) per stamparle come testo in un file di istruzioni da inviare a un CN...

Le ho provate di tutte prima di leggere questo thread e scoprire String.format() e la classe Formatter :stordita:

Thanks :)