Symptom

The IsNumber function is returning true for a value that uses a comma as the decimal separator when the regional setting is set to use a period as the decimal separator.  It should return false.

Environment

  • PowerBuilder
  • Windows 7 Server
  • Windows 2008 Server.

Reproducing the Issue

1.  Verify the Windows Control Panel regional settings for the decimal separator is a period:

 regional_settings.png

2.  Test isNumber function with a value using a period "." as the decimal and another number with a comma "," as a decimal. 

pb_window.png

 

Code behind the isNumber button:

//The isNumber() returns a boolean. 

//With the regional setting decimal setting as a period. The value tested should return true if the decimal separator is a period and false if the decimal separator is a comma.

string ls_decimal, ls_comma

ls_decimal = sle_1.text
ls_comma = sle_2.text

sle_3.text = string(IsNumber(ls_decimal))
sle_4.text = string(IsNumber(ls_comma))

Cause

This is a product defect that occurs on the Windows 7 and Windows 2008 Server operating systems.

Resolution

The following workaround is provided: 
long ll_len,ll_flag
int i
string ls_nbr

ll_flag = 0
ls_nbr = "34.39"

// Use IsNumber() to still test for alpha characters
if isnumber(ls_nbr) then

      // move string to char array
      myarray = ls_nbr
     // get the length of the char array or number
     ll_len = upperbound(myarray)
     // find the comma
     for i = 1 to ll_len
          if (myarray[i] = ',') then
          // set a flag indicating comma instead of decimal
            ll_flag = 1
            messagebox("Invalid Number","ls_nbr is not valid--found a comma instead of a decimal")
            return
          end if
     next
else

     messagebox("Invalid Number","ls_nbr is not a number-contains alpha characters")

end if

1
0