[Gambas-user] Converting strings to numbers with localization issues

Ron ron at ...1740...
Mon Aug 23 12:34:49 CEST 2010


  On 23-8-2010 12:19, Benoît Minisini wrote:
>>    On 23-8-2010 11:54, Benoît Minisini wrote:
>>>>     In my project I have several temp values in the form of 31.72 C
>>>>
>>>> They are stored as string and I convert them with Val(sValue)
>>>>
>>>> My project is translatable, default language is en_US.UTF-8
>>>>
>>>> If I change System.Language, Val doesn't know how to convert the value
>>>> correctly (or it does it correctly, but I have to change my code)
>>>>
>>>> Anyone had this problem and knows how to prevent the system from leaving
>>>> out point or comma's or the complete value?
>>>>
>>>> Example project with output:
>>>>
>>>> ' Gambas module file
>>>>
>>>> PUBLIC SUB Main()
>>>>
>>>>      DIM sValue AS String = "31,72"
>>>>
>>>>      PRINT "Original Value ->   "&   sValue
>>>>
>>>>      PRINT System.Language&   " ->   ";
>>>>      PRINT Val(sValue)
>>>>
>>>>      System.Language = "nl_NL.UTF-8"
>>>>      PRINT System.Language&   " ->   ";
>>>>      PRINT Val(sValue)
>>>>
>>>>      System.Language = "de_DE.UTF-8"
>>>>      PRINT System.Language&   " ->   ";
>>>>      PRINT Val(sValue)
>>>>
>>>>      sValue = "31.72"
>>>>      PRINT "\nOriginal Value ->   "&   sValue
>>>>
>>>>      PRINT System.Language&   " ->   ";
>>>>      PRINT Val(sValue)
>>>>
>>>>      System.Language = "nl_NL.UTF-8"
>>>>      PRINT System.Language&   " ->   ";
>>>>      PRINT Val(sValue)
>>>>
>>>>      System.Language = "de_DE.UTF-8"
>>>>      PRINT System.Language&   " ->   ";
>>>>      PRINT Val(sValue)
>>>>
>>>> END
>>>>
>>>> OUTPUT IS:
>>>>
>>>> Original Value ->   31,72
>>>> en_US.UTF-8 ->   3172
>>>> nl_NL.UTF-8 ->   31,72
>>>> de_DE.UTF-8 ->   31,72
>>>>
>>>> Original Value ->   31.72
>>>> de_DE.UTF-8 ->   3172
>>>> nl_NL.UTF-8 ->
>>>> de_DE.UTF-8 ->   3172
>>>>
>>>> So if I store it with . or , it's false interpreted by at least one of
>>>> the languages...
>>>> I do not have the same values, I also store energy usage and other
>>>> values in the form of 41.322 Watts, so the decimal point is not always
>>>> at 2
>>>>
>>>> I remember this type of discussion regarding currency, how was it
>>>> solved?
>>>>
>>>> Please any input is welcome.
>>>>
>>>> Gambas2, gb.qt, Ubuntu 10.04
>>>>
>>>> Regards,
>>>> Ron_2nd.
>>> The meaning of "." and "," in numbers changes with the language (the
>>> "localization"), and Val() follows the localization settings, so all that
>>> is logical.
>>>
>>> So use CFloat() instead of Val() to have a behaviour that does not
>>> depends on localization, and create your own conversion function with
>>> it.
>>>
>>> Regards,
>> I have noticed that when using CFloat(sValue)  I have to check/translate
>> commas to dots first if found in string, otherwise CFloat says 'wanted
>> float got string instead'
>>
>> Would be handy to know what Val() does behind the scene, do you know
>> without having to search through your code? It's hard for me to find.
>>
>> Thanks
>>
>> Regards,
>> Ron_2nd.
>>
> What Val() does is explained in its wiki documentation page. What information
> do you need that is not in that page?
>

I was thinking about the code behind it, but it's not important.

One last question, is the behaviour below normal?
The first CFloat (en_US) returns a dot while the rest returns a comma in 
the result, ie the are not consistant either, I must have overlooked 
something..or .?

PUBLIC SUB Main()

   DIM sValue AS String = "31,72"

   ' replace , by .
   sValue = Replace(sValue, ",", ".", gb.String)

   PRINT "Original Value -> " & sValue

   PRINT System.Language & " -> ";
   PRINT CFloat(sValue)

   System.Language = "nl_NL.UTF-8"
   PRINT System.Language & " -> ";
   PRINT CFloat(sValue)

   System.Language = "de_DE.UTF-8"
   PRINT System.Language & " -> ";
   PRINT CFloat(sValue)

END

OUTPUTS:

Original Value -> 31.72
en_US.UTF-8 -> 31.72
nl_NL.UTF-8 -> 31,72
de_DE.UTF-8 -> 31,72

Regards,
Ron_2nd.




More information about the User mailing list