Linux 64bit Xojo.Core.Locale bug?

Bungiorno a tutti,

avrei bisogno di un aiuto per capire se sbaglio qualcosa io o c’ qualche bug che provoca questo casino. Praticamente durante lo sviluppo di un’applicazione web avrei bisogno di esprimere i valori monetari con il formato italiano es: 1000,00 (con la virgola al posto del punto). Ovviamente a livello grafico di stringa nelle WebTextField uso un semplice replace, fin qui nessun problema. Quando provo a fare i calcoli trasformando la stringa in Double in modalit debug su windows non mi da nessun problema. Quando carico l’applicazione compilata sul webserver mi sballa tutti i valori. Utilizzo xojo 2016 r 4.1 e apache su linux 64 bit. ( ho provato anche la versione 32bit ma il risultato non cambia)

Allego di seguito un esempio del codice con i relativi output:

dim stringa as String = "33883,6789"
		
		
		dim n as Double = CDbl(replace(stringa,".",","))
		
		
		dim t as text = n.ToText( xojo.core.Locale.current, "###,###,###.00;-###,###,###.00")
		
		 msgbox t
		
		  t = n.ToText( New Xojo.Core.Locale("it-IT"), "###.00;-###.00")
		
		 msgbox t
Su windows ottengo  : 33.883,68 e 33883,68
    Su linux ottengo : $338,836,789.00 e 338836789,00

Ciao Attilio
… si sbagli qualcosa…
Cdbl interpreta la stringa con il formato locale e se sul server le impostazioni non sono it-IT il numero non viene convertito correttamente.

Ti conviene fare l’operazione inversa
Ovvero trasformare la stringa del numero in formato “codice” (come quando scrivi un valore double nel codice) quindi e poi ottenerne il valore

dim stringa as string="33883,6789"
dim n as Double=stringa.replace(",", ".").val //Utilizzi la sua interpretazione numerica

//Alternativa con text
dim testo as Text="33883,6789"
dim nn as Double=Double.Parse(testo.replaceAll(",", "."))

//Ora n (o nn) li puoi utilizzare e visualizzare con il Locale.current o un Locale scelto

Ciao Antonio,

Grazie mille per la risposta davvero utile.
Avevo immaginato fosse un problema relativo alle configurazioni lato server per quello provavo prima la conversione locale e poi “forzandola” con New Xojo.Core.Locale(“it-IT”). Non sapevo che il CDbl utilizzasse da solo tale formato. Quindi immagino che lo stesso meccanismo si innesca con l’utilizzo di FORMAT(). C’ un modo per utilizzare il comando Format() specificando il tipo di Locale?

Momentaneamente se serve a qualcuno ho risolto il problema utilizzando il tipo Currency in questo modo:

Currency.FromText(s.ToText, New Xojo.Core.Locale("it-IT"))  

Il problema che riconvertendo la variabile da Currency a stringa mette in automatico il carattere

c.ToText(New Xojo.Core.Locale("it-IT"))

Si CDbl serve a leggere il formato “localizzato”.
Per essere sicuri, visto che ci sono anche utenti che scrivono con il punto e dovendo in ogni caso avere un valore in tale formato ti conviene sempre convertire la , in punto e usare val o utilizzare il fromText in formato neutro.

Format sempre in locale
Se vuoi un che sia sempre uguale (ovvero il formato “codice”) usa str. Questa funzione, normalmente utilizzata con un solo parametro, in realt ne accetta anche un secondo che la stringa di formattazione (la stessa che puoi usare in format)

Lo stesso per toText
senza parametri in realt utilizza il Xojo.Core.Locale.Raw
Ad esempio per scrivere un testo come se fosse un currency ma senza “effetti locali”:
numero.toText(Xojo.Core.Locale.Raw, “#.00”)