Italian Formattare con separat migliaia e virgola decimali (modo italiano)

Sabotto

Active Member
Licensed User
Ho delle stringhe lette con questo formato : esempio: 12345,6789
Vorrei esporle con il separat. delle migliaia e arrotond. a due decimali, quindi ottenere 12.345,68
Sto impazzendo con NumberFormat2 ecc. ma non ci riesco perchè mi mette la virgola come separatore delle migliaia e il punto come separatore dei decimali
Allora ho provato a creare una funzioncina che dopo che lui mi ha trasformato il numero in 12,345.68 sostituisse la virrgola col punto e il punto con la virgola.
Ma non funziona. suggerimenti?

B4X:
    Sub prova()
   
    Dim s As String ="12345,6789"
    Dim s1 As String = s.Replace(",",".") 'lo rendo numero come lo vuole lui
    Dim s2 As String = NumberFormat2(s1, 0, 2, 2, True) 'separat. migliaia e due decimali
   
    'A questo punto ho il numero formattato con la virgola come separat. migliaia
    ' e il punto come separat. dei decimali
    'Ma a me serve il contrario e quindi opero una serie di sostituzioni
    '(che mi sono accorto che in realtà non fa!!!!)
    s2.Replace(",","A") ' sostituisco la virgola con carattere A
    s2.Replace(".","B") ' sostituisco il punto con carattere B
    s2.Replace("A",".") ' sostituisco la A col punto
    s2.Replace("B",",") ' e la B con la virgola

    Log(s2) 'non funziona, mi attendevo 12.345,68 ma esce  12,345.68
           
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Ehm... devo ammettere, vergognandomi non poco, che non ricordo le forse varie routine che scrissi, dovrei cercare (forse usai AHLocale o simili).

Al volo, direi di usare NumberFormat2 per "riempire" una variabile stringa; poi sostituisci i punti (o le virgole), con un carattere speciale "di tua invenzione" (o anche 2 o 3, non ha importanza), poi sostituisci le virgole (o i punti, se prima hai fatto l'inverso) con i punti e infine i tuoi caratteri speciali con virgole.

Chiaro, no? 😄

Beh, ora lo scrivo in una funzioncina con B4J e poi magari cerco tra i 10.000 progettini in quale usare il metodo migliore.

A frappè.
 

Star-Dust

Expert
Licensed User
Longtime User
B4X:
    Sub prova()

    Dim s As String ="12345,6789"
    Dim s1 As String = s.Replace(",",".") 'lo rendo numero come lo vuole lui
    Dim s2 As String = NumberFormat2(s1, 0, 2, 2, True) 'separat. migliaia e due decimali

    'A questo punto ho il numero formattato con la virgola come separat. migliaia
    ' e il punto come separat. dei decimali
    'Ma a me serve il contrario e quindi opero una serie di sostituzioni
    '(che mi sono accorto che in realtà non fa!!!!)
    S2=s2.Replace(",","A") ' sostituisco la virgola con carattere A
    S2=s2.Replace(".","B") ' sostituisco il punto con carattere B
    S2=s2.Replace("A",".") ' sostituisco la A col punto
    S2=s2.Replace("B",",") ' e la B con la virgola

    Log(s2) 'non funziona, mi attendevo 12.345,68 ma esce  12,345.68
      
End Sub
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Beh, ora lo scrivo in una funzioncina con B4J e poi magari cerco tra i 10.000 progettini in quale usare il metodo migliore.

A frappè.
B4X:
Public Sub Inverti(Num As Double, MinIntegers As Int, MaxFractions As Int, MinFractions As Int, Grouping As Boolean) As String
    Dim strNum As String = NumberFormat2(Num, MinIntegers, MaxFractions, MinFractions, Grouping)
    strNum = strNum.Replace(",", "°")
    strNum = strNum.Replace(".", ",")
    strNum = strNum.Replace("°", ".")
    Return strNum
End Sub

Ovviamente non ho avuto tempo per testarla. Inoltre, meglio dargli un nome più decente.


P.S. Urka, erano già passati 5 minuti ed era arrivato un nuovo post di.... qualcuno (che non avevo visto, avevo lasciato questa pagina aperta, che ovviamente non si è aggiornata da sé).
 

LucaMs

Expert
Licensed User
Longtime User
Ovviamente non ho avuto tempo per testarla. Inoltre, meglio dargli un nome più decente.
Pare che funzioni:
B4X:
Sub Button1_Click
    Dim Value As Double = 1234567.89
    Log(NumberFormat2(Value,1, 2, 2, True))
    Log(InvertiSegniSeparatori(Value, 1, 2, 2, True))
End Sub

Public Sub InvertiSegniSeparatori(Num As Double, MinIntegers As Int, MaxFractions As Int, MinFractions As Int, Grouping As Boolean) As String
    Dim strNum As String = NumberFormat2(Num, MinIntegers, MaxFractions, MinFractions, Grouping)
    strNum = strNum.Replace(",", "°")
    strNum = strNum.Replace(".", ",")
    strNum = strNum.Replace("°", ".")
    Return strNum
End Sub

Log:
1,234,567.89
1.234.567,89
 

LucaMs

Expert
Licensed User
Longtime User
Versione più compatta 😁:
B4X:
Public Sub InvertiSegniSeparatori(Num As Double, MinIntegers As Int, MaxFractions As Int, MinFractions As Int, Grouping As Boolean) As String
    Dim strNum As String = NumberFormat2(Num, MinIntegers, MaxFractions, MinFractions, Grouping)
    Return strNum.Replace(",", "°").Replace(".", ",").Replace("°", ".")
End Sub
 

Sabotto

Active Member
Licensed User
Non hai letto attentamente credo. Io ho una stringa che rappresenta un numero. E' questa stringa che voglio visualizzare con il formato migliaia e due decimali
Per riprendere il tuto codice, deve essere
B4X:
     Dim strValue As String = "12345,678" ' questa stringa deve diventare "12.345,68"
Tu invece, col tuo esempio, sei partito da un numero con il punto "1234567.89"
 

LucaMs

Expert
Licensed User
Longtime User
Non hai letto attentamente credo. Io ho una stringa che rappresenta un numero. E' questa stringa che voglio visualizzare con il formato migliaia e due decimali
Per riprendere il tuto codice, deve essere
B4X:
     Dim strValue As String = "12345,678" ' questa stringa deve diventare "12.345,68"
Tu invece, col tuo esempio, sei partito da un numero con il punto "1234567.89"
In quale formato è la tua stringa originale, "anglosassone"? O sono 678 millesimi - formato "italiano"?
 

Sabotto

Active Member
Licensed User
Fermi tutti. Ho provato in B4J la mia routine e funziona. Ho riprovato con B4A e funziona anche li!!. E perche prima no?
Ora riprovo nel programma dove avevo iniziato a fare le prove, dove non mi funzionava, perche come detto non faceva le sostituzioni con i vari replace.
 

LucaMs

Expert
Licensed User
Longtime User
Fermi tutti. Ho provato in B4J la mia routine e funziona. Ho riprovato con B4A e funziona anche li!!. E perche prima no?
Ora riprovo nel programma dove avevo iniziato a fare le prove, dove non mi funzionava, perche come detto non faceva le sostituzioni con i vari replace.
Ok, ma ora sono curioso: parti da stringhe "all'italiana"?

Cmq... non mi sto muovendo 😄
 

TILogistic

Expert
Licensed User
Longtime User
B4XFormatter

B4X:
    Dim value As String = "12345,6789"
    Dim data As Double = Round2(value.Replace(",","."), 2)
    
    Dim formatter As B4XFormatter
    formatter.Initialize
    formatter.GetDefaultFormat.GroupingCharacter = "."
    formatter.GetDefaultFormat.DecimalPoint = ","

    Log(data)
    Log(formatter.Format(data))

12345.68
12.345,68
 

LucaMs

Expert
Licensed User
Longtime User
Supponendo che la tua stringa sia in formato italiano:
B4X:
Sub Button1_Click
    Dim strValue As String = "12345,678"
    Log(InvertiSegniSeparatoriStr(strValue, 1, 2, 2, True))
End Sub

Public Sub InvertiSegniSeparatori(Num As Double, MinIntegers As Int, MaxFractions As Int, MinFractions As Int, Grouping As Boolean) As String
    Dim strNum As String = NumberFormat2(Num, MinIntegers, MaxFractions, MinFractions, Grouping)
    Return strNum.Replace(",", "°").Replace(".", ",").Replace("°", ".")
End Sub

Public Sub InvertiSegniSeparatoriStr(Num As String, MinIntegers As Int, MaxFractions As Int, MinFractions As Int, Grouping As Boolean) As String
    ' NOTA: usa InvertiSegniSeparatori.
    Dim Dbl As Double = Num.Replace(",", "°").Replace(".", ",").Replace("°", ".")
    Return InvertiSegniSeparatori(Dbl, MinIntegers, MaxFractions, MinFractions, Grouping)
End Sub
 

Sabotto

Active Member
Licensed User
Ok, ma ora sono curioso: parti da stringhe "all'italiana"?

Cmq... non mi sto muovendo 😄
Parto da stringhe cosi:
"12345,678" deve diventare 12.345,68
"3,45" --> 3,45
"123" --> 123,00
"2456000,3" --> 2.456.000,30

Ho riprovato nel vecchio progetto e non funziona (la stessa identica routine). Cambia solo che la prima prova funzionante l'ho fatta con B4A usando i un activity e dove non funziona uso le B4xPages. Possibile che dipenda da questo....?
Comunque dopo testo anche la routine di @oparra
E cerco di lasciare solo la routine nella b4xpage dove non mi funziona devo capire dove si impalla
 

TILogistic

Expert
Licensed User
Longtime User
Parto da stringhe cosi:
"12345,678" deve diventare 12.345,68
"3,45" --> 3,45
"123" --> 123,00
"2456000,3" --> 2.456.000,30

Ho riprovato nel vecchio progetto e non funziona (la stessa identica routine). Cambia solo che la prima prova funzionante l'ho fatta con B4A usando i un activity e dove non funziona uso le B4xPages. Possibile che dipenda da questo....?
Comunque dopo testo anche la routine di @oparra
E cerco di lasciare solo la routine nella b4xpage dove non mi funziona devo capire dove si impalla
formatter.GetDefaultFormat.MaximumFractions = 2
formatter.GetDefaultFormat.MinimumFractions = 2


B4X:
    Dim formatter As B4XFormatter
    formatter.Initialize
    formatter.GetDefaultFormat.GroupingCharacter = "."
    formatter.GetDefaultFormat.DecimalPoint = ","
    formatter.GetDefaultFormat.MaximumFractions = 2
    formatter.GetDefaultFormat.MinimumFractions = 2
   
    Dim value As String = "12345.678"
    Dim data As Double = Round2(value.Replace(",","."), 2)
    Log(data)
    Log(formatter.Format(data))
   
    Dim value As String = "3.45"
    Dim data As Double = Round2(value.Replace(",","."), 2)
    Log(data)
    Log(formatter.Format(data))
   
    Dim value As String = "123"
    Dim data As Double = Round2(value.Replace(",","."), 2)
    Log(data)
    Log(formatter.Format(data))
   
    Dim value As String = "2456000.3"
    Dim data As Double = Round2(value.Replace(",","."), 2)
    Log(data)
    Log(formatter.Format(data))

12345.68
12.345,68
3.45
3,45
123
123,00
2456000.3
2.456.000,30
 

LucaMs

Expert
Licensed User
Longtime User
B4XFormatter

B4X:
    Dim value As String = "12345,6789"
    Dim data As Double = Round2(value.Replace(",","."), 2)

    Dim formatter As B4XFormatter
    formatter.Initialize
    formatter.GetDefaultFormat.GroupingCharacter = "."
    formatter.GetDefaultFormat.DecimalPoint = ","

    Log(data)
    Log(formatter.Format(data))
Questo dovrebbe essere migliore e più divertente!
This one should be better and... fun!
B4X:
    Dim value As String = "123456789,12899"
    Dim data As Double = Round2(value.Replace(",","."), 2)

    Dim formatter As B4XFormatter
    formatter.Initialize
    formatter.GetDefaultFormat.GroupingCharacter = "˙"
    formatter.GetDefaultFormat.DecimalPoint = ","

    Log(formatter.Format(data))
perché, almeno in Italia, quando le cose funzionavano bene, il separatore delle migliaia era un punto in alto, non in basso.
because, at least in Italy, when things worked right, the thousands separator was a dot up, not down.
Log:
123˙456˙789,13

:)
 

Sabotto

Active Member
Licensed User
Esco pazzo. Nello stesso progetto, la stessa routine una volta funziona e un'altra no.
Guardate se ne avete voglia. sono 4 righe...
 

Attachments

  • ProveVarie.zip
    79.9 KB · Views: 125

LucaMs

Expert
Licensed User
Longtime User
Esco pazzo. Nello stesso progetto, la stessa routine una volta funziona e un'altra no.
Guardate se ne avete voglia. sono 4 righe...
Provo a guardarlo al volo, ma tra poco... Belgio - Portogallo.
(Si domandano: "Sarà meglio dover incontrare il Belgio o il Portogallo?". Domanda scema, visto che incontreremo la vincente! Sarebbe meglio incontrare la perdente, ma temo non sia possibile 😄).
 

TILogistic

Expert
Licensed User
Longtime User
Questo dovrebbe essere migliore e più divertente!
This one should be better and... fun!
B4X:
    Dim value As String = "123456789,12899"
    Dim data As Double = Round2(value.Replace(",","."), 2)

    Dim formatter As B4XFormatter
    formatter.Initialize
    formatter.GetDefaultFormat.GroupingCharacter = "˙"
    formatter.GetDefaultFormat.DecimalPoint = ","

    Log(formatter.Format(data))
perché, almeno in Italia, quando le cose funzionavano bene, il separatore delle migliaia era un punto in alto, non in basso.
because, at least in Italy, when things worked right, the thousands separator was a dot up, not down.
Log:
123˙456˙789,13

:)
in chile il separatore delle migliaia è il punto e il decimale è la virgola
😇😇😇
 
Top