Subject Re: string with commas to numeric
From Charlie <tm@tc.com>
Date Sat, 09 Mar 2024 10:19:58 -0500
Newsgroups dbase.getting-started

Hi Akshat...  Thanks very much for the info!

Akshat Kapoor Wrote:

> Good Evening Charlie,
>
> >
> > form.spinboxestv1.value = val(co.fields["&grd."].value)
> >
> > The spinbox is numeric and co is a string.   This works unless there are commas in the string.  Then  17,234 becomes 17.
> >
> > How can I get the entire number without commas when the string has commas in it?
>
> This is just for additional ideas since you have a working solution.
> I was out of station so just started reading the post after many days.
> The following routine is there in stringEx.cc of duflp
>
>     function Text2Num
>        /*
>           -------------------------------------------------------------
>           Programmer..: Akshat Kapoor
>           Date........: August, 2021
>           Notes.......: Converts a character string with a numeric
>                         value to the appropriate numeric value
>                         in dBASE. Created to deal with input from
>                         a CSV file, where many different issues
>                         come up with numeric formats. The difficulty
>                         is if the string has the "thousands" separator
>                         (123,456.12), and it is a string, the val()
>                         function stops at the separator, and returns
>                         123, instead of the full numeric value. Other
>                         issues such as negative numbers in parens,
>                         different decimal point symbols for different
>                         parts of the world, make things even more fun.
>           Written for.: dBASE 2019
>           Rev. History: August, 2021 -- KJM -- with Akshat's permission
>                          co-opted it for the Import Data routines in the
>                          dUFLP.
>           Calls.......: None
>           Usage.......: Text2Num( <cNumber>, <cDecimal> )
>           Example.....: ? Text2Num( "123,456.12", "." )   --> 123456.12
>                         ? Text2Num( "123.456,12", "," )   --> 123456.12
>                         ? Text2Num( "(123.456,12)", "," ) --> -123456.12
>           Returns.....: numeric value with no formatting except for
>                         decimal
>           Parameters..: cNumber = character string containing numeric value
>                                   with whatever formatting is in the string
>                         cDecimal = decimal point character. Default is "."
>
>           NOTE: This is designed specifically for the purpose of converting
>           numeric values that are stored in strings, to their actual
>           numeric value. If you pass, say, a phone number string to this
>           function, the results will be odd, to say the least.
>           -------------------------------------------------------------
>        */
>        parameters cStr, cDecimal
>
>        if pCount() == 0 // no parameters
>           msgbox( "Please pass the character string necessary to convert
> to "+;
>                   "a numeric value!", "Missing Parameter", 16 )
>           return 0
>        endif
>        if pCount() == 1 // only one parameter
>           cDecimal = "." // default of a period for the decimal point marker
>        endif
>
>        private cRetVal, cAllowed, a, cCurrent, cLocalDecimal
>        cLocalDecimal = set( "point" )
>        cRetVal = ''
>        // allowed characters in resulting string:
>        cAllowed = '0123456789-'
>
>        // loop through the character string, one character at a time:
>        for a = 1 to len(cStr)
>            cCurrent = substr(cStr,a,1)
>            if cCurrent $ cAllowed
>               cRetVal+= cCurrent
>            elseif cCurrent = '(' // we have a negative number: (123) is -123
>               cRetVal = '-'+cRetVal
>           elseif cCurrent = '%' // percentage, divide the value by 100
>                                 // 50% = 0.50
>              cRetVal = " " + (val(cRetVal)/100)
>           elseif cCurrent = cDecimal
>               cRetVal = cRetVal + cLocalDecimal // add the decimal point
> symbol
>           endif
>        endfor
>
>     return val( cRetVal )
>     // End of method: Text2Num()
>
>
> Regards
> Akshat
>