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

Fabien Bodard gambas.fr at ...626...
Mon Aug 23 14:28:30 CEST 2010


CFLoat return a Float variable ... so PRINT just see a variable and
not a convertion funtion ... PRINT do what it do for every float,
display the number in localization settings.



2010/8/23 Ron <ron at ...1740...>:
>  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.
>
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by
>
> Make an app they can't live without
> Enter the BlackBerry Developer Challenge
> http://p.sf.net/sfu/RIM-dev2dev
> _______________________________________________
> Gambas-user mailing list
> Gambas-user at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user
>




More information about the User mailing list