Italian Manipolare numeri

nonno

Active Member
Licensed User
Longtime User
di nuovo avrei bisogno dei vostri consigli, dovrei trasformare i numeri con punti e virgola , ma usando
Label1.Text = NumberFormat(123456789, 0, 2) visualizza 123,456,789
per visualizzare in questo modo 1.234.567,89 ?
per aggiungere virgola e punto divido la strina con SubString2 ma è un tantino macchinoso….
qualche consiglio
 

MarcoRome

Expert
Licensed User
Longtime User
Per B4J - B4A - B4i
B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim formatter As B4XFormatter
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("xxx")
    formato_europeo

    dim importo_accumulato as Double = 123000.987

    Log($"TOTALE EURO  ${formatter.Format(importo_accumulato)}€"$)
    'Torna 123.000,99'

End Sub

Sub formato_europeo
    'Formatto con Numero Europeo
    formatter.Initialize
    Dim DefaultFormat As B4XFormatData = formatter.GetDefaultFormat
    DefaultFormat.DecimalPoint = ","
    DefaultFormat.GroupingCharacter = "."
    DefaultFormat.MaximumFractions = 2
    DefaultFormat.MinimumFractions = 0
    formatter.AddFormatData(DefaultFormat, 0,0,False)
End Sub
 
Last edited:

nonno

Active Member
Licensed User
Longtime User
Dim formatter As B4XFormatter

non funziona .. uso B4A forse ho una versione vecchia … .. sono circa due anni che non faccio l'aggiornamento, ho scaricato la libreria B4XFormatter non la riconosce :oops:
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
Label1.Text = NumberFormat(123456789, 0, 2) visualizza 123,456,789
c'è un errore
questo 123456789
non è questo 1234567,89
NumberFormat(123456789, 0, 2) visualizza 123,456,789
NumberFormat(1234567.89, 0, 2) visualizza 1,234,567.89
NumberFormat2(1234567.89,0,2,0,false) visualizza 1234567.89
se vuoi mettere i punti al posto delle virgole e la virgola al posto del punto la strada è
1) cambiare le impostazioni del S.O.
2) usare .replace
NumberFormat(1234567.89,0,2).Replace(".",";").Replace(",",".").replace(";",",") visualizza 1.234.567,89
da notare il primo replace da ' . ' a ' ; ' questo perché i replace vengono eseguiti in sequenza
 

udg

Expert
Licensed User
Longtime User
Ancora un modo, provato in B4J.
ps: lo scopo era scrivere qualcosa che utilizzasse inline Java (malgrado le scarse competenze..ehehe)

Separatori: B4J e inline Java:
Sub Process_Globals
    Private fx As JFX
    Private MainForm As Form
    Private NativeMe As JavaObject
End Sub

Sub AppStart (Form1 As Form, Args() As String)
    MainForm = Form1
    'MainForm.RootPane.LoadLayout("Layout1") 'Load the layout file.
    MainForm.Show
    NativeMe = Me
    
    'Standard
    Log(NumberFormat2(123456789,1,2,2,True))
    
    'Italiano
    Dim s As String = NativeMe.RunMethod("formattaIT",Array(123456789.54,"###,###.##"))
    Log(s)
    
    'Generico
    Dim migliaia As Char = "-"
    Dim decimale As Char = "*"
    Dim s As String = NativeMe.RunMethod("formatta",Array(123456789.54,"###,###.##", decimale, migliaia))
    Log(s)
End Sub


'Return true to allow the default exceptions handler to handle the uncaught exception.
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub

#if JAVA
import java.util.*;
import java.text.*;

//formatta in base ai parametri
static public String formatta(double value, String pattern, char decimal, char thousand) {
    Locale currentLocale = new Locale("it", "IT");
    DecimalFormatSymbols mySymbols = new DecimalFormatSymbols(currentLocale);
    mySymbols.setDecimalSeparator(decimal);
    mySymbols.setGroupingSeparator(thousand);
    DecimalFormat df = new DecimalFormat(pattern, mySymbols);
    df.applyPattern(pattern);
    String output = df.format(value);
    return output;
}

//usa impostazione locale correnti, nel mio caso italiano
static public String formattaIT(double value, String pattern) {   
    DecimalFormat myFormatter = new DecimalFormat(pattern);
    String output = myFormatter.format(value);
    return output;
}

//formatta in base al locale passato come parametro
static public void localizedFormat(String pattern, double value, Locale loc ) {
      NumberFormat nf = NumberFormat.getNumberInstance(loc);
      DecimalFormat df = (DecimalFormat)nf;
      df.applyPattern(pattern);
      String output = df.format(value);
      System.out.println(pattern + "  " + output + "  " + loc.toString());
}
#End If
 
Top