CInt produce System.ArgumentException: "currency separator information is ambiguous for parsing"

A

Atara

In my apllication I use the following code:

'-- My Code:
Public Shared Function strDate2Date(ByVal strDate As String) As
System.DateTime
Dim isOk As Boolean = False
If (strDate Is Nothing) Then
isOk = False
ElseIf Not (strDate.Length() = 6) Then
isOk = False
Else
isOk = True
Dim yyyy As Integer = CInt(strDate.Substring(0, 2)) + 2000
Dim mm As Integer = CInt(strDate.Substring(2, 2))
Dim dd As Integer = CInt(strDate.Substring(4, 2))
Return (New System.DateTime(yyyy, mm, dd))
End If
Return Nothing
End Function

dim myDateCreated1 As System.DateTime = strDate2Date("020801") ' 1
Aug 2002
dim myDateCreated2 As System.DateTime = strDate2Date("040404") ' 4
Apr 2004
dim myDateCreated3 As System.DateTime = strDate2Date("040420") ' 20
Apr 2004
dim myDateCreated4 As System.DateTime = strDate2Date("041104") ' 4
Nov 2004
'-- Code till here.

On of my Italian client got the exception:

'-- Exception:
System.ArgumentException: The currency separator information specified
in the NumberFormatInfo is ambiguous for parsing.
at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String
Value, NumberFormatInfo NumberFormat)
at
Microsoft.VisualBasic.CompilerServices.IntegerType.FromString(String
Value)
at myassembly.strDate2Date(String strDate)
'-- Exception till here.

When googling I understood that the VB compiler compiles CInt into -
Microsoft.VisualBasic.CompilerServices.IntegerType::FromString(string)

So the exception is coming from one of the following lines:
CInt("01")
CInt("02")
CInt("04")
CInt("08")
CInt("11")
CInt("20")

Any idea why do I get an exception?
Do I have to use [NumberFormatInfo and CultureInfo] whenever I parse
strings to numbers?

Thanks.

Atara.
 
C

Cor Ligthert

Altara,

For your purpose is already a method, can you try this

Dim myDateCreated1 As System.DateTime = DateTime.ParseExact("020801",
"yyMMdd", Nothing) ' 1 Aug(2002)
Dim myDateCreated2 As System.DateTime = DateTime.ParseExact("040404",
"yyMMdd", Nothing) ' 4 Apr(2004)
Dim myDateCreated3 As System.DateTime = DateTime.ParseExact("040420",
"yyMMdd", Nothing) ' 20 Apr(2004)
Dim myDateCreated4 As System.DateTime = DateTime.ParseExact("041104",
"yyMMdd", Nothing) ' 4 Nov(2004)

I hope this helps?

Cor
 
A

Atara

Thanks, i will try it.
but I am also concerned for other code-lines in my program that I use -
Dim myInt As Integer = CInt(myStr)

Why do I get this exception for the first place?
atara.
 
C

Cor Ligthert

Atara,

I do not see this, maybe you can try this on that one computer.

Dim myDateCreated1 As System.DateTime = New System.DateTime(2002, 8, 1) ' 1
Aug(2002)
Dim myDateCreated2 As System.DateTime = New System.DateTime(2004, 4, 4) ' 4
Apr(2004)
Dim myDateCreated3 As System.DateTime = New System.DateTime(2004, 4, 20) '
20 Apr(2004)
Dim myDateCreated4 As System.DateTime = New System.DateTime(2004, 11, 4) '
4 Nov(2004)

Because that is the only datetime affected part in your sample.

Accoording to this it should in my opinion works on every computer

http://msdn.microsoft.com/library/d...f/html/frlrfsystemdatetimeclassctortopic2.asp

I hope this helps?

Cor
 
A

Atara

Thanks for your efforts!

1. It is on a client computer, and I did not manage to reproduce the
same OS with the same languages on our computer. hopefully we will do it
within some hours.

2. The Exception occured at -
"Microsoft.VisualBasic.CompilerServices.IntegerType.FromString(String
Value)"
and not on "System.DateTime.constructor"


Thanks. Atara.
 
J

Jay B. Harlow [MVP - Outlook]

Atara,
As Cor suggests I would use DateTime.ParseExact in the strDate2Date routine.

As to the specifics of the exception:

Are certain that the input string contains only digits & not some other
character?

That you are not inadvertently doing:
dim myDateCreated1 As System.DateTime = strDate2Date("..,,..")

Or other invalid character sequences...

You could always include the debug program database (the .pdb file) for this
user.

If you are compiling with release build you can use "Project - Properties -
Configuration Properties - Build - Generate debugging information" then
install the .pdb file in the same folder as the executable. When you include
the .pdb file, the Stack Trace on Exceptions will include file names & line
numbers, allowing you to identify specifically which line had the problem.

Alternatively you could include a Try/Catch within strDate2Date to give
context information.

Something like:
Public Shared Function strDate2Date(ByVal strDate As String) As
System.DateTime
Try
Dim isOk As Boolean = False
If (strDate Is Nothing) Then
isOk = False
ElseIf Not (strDate.Length() = 6) Then
isOk = False
Else
isOk = True
Dim yyyy As Integer = CInt(strDate.Substring(0, 2)) + 2000
Dim mm As Integer = CInt(strDate.Substring(2, 2))
Dim dd As Integer = CInt(strDate.Substring(4, 2))
Return (New System.DateTime(yyyy, mm, dd))
End If
Return Nothing
Catch ex As Exception
Throw New ArgumentException("Invalid date parameter '" & strDate
& "'", "strDate", ex)
End Try
End Function

This way you will see what the parameter value was, I would consider
creating a new exception class that derives from ArgumentException that
included both the parameter name & its value (ala
ArgumentOutOfRangeException) instead of using ArgumentException directly.

Hope this helps
Jay

Atara said:
In my apllication I use the following code:

'-- My Code:
Public Shared Function strDate2Date(ByVal strDate As String) As
System.DateTime
Dim isOk As Boolean = False
If (strDate Is Nothing) Then
isOk = False
ElseIf Not (strDate.Length() = 6) Then
isOk = False
Else
isOk = True
Dim yyyy As Integer = CInt(strDate.Substring(0, 2)) + 2000
Dim mm As Integer = CInt(strDate.Substring(2, 2))
Dim dd As Integer = CInt(strDate.Substring(4, 2))
Return (New System.DateTime(yyyy, mm, dd))
End If
Return Nothing
End Function

dim myDateCreated1 As System.DateTime = strDate2Date("020801") ' 1
Aug 2002
dim myDateCreated2 As System.DateTime = strDate2Date("040404") ' 4
Apr 2004
dim myDateCreated3 As System.DateTime = strDate2Date("040420") ' 20
Apr 2004
dim myDateCreated4 As System.DateTime = strDate2Date("041104") ' 4
Nov 2004
'-- Code till here.

On of my Italian client got the exception:

'-- Exception:
System.ArgumentException: The currency separator information specified
in the NumberFormatInfo is ambiguous for parsing.
at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String
Value, NumberFormatInfo NumberFormat)
at
Microsoft.VisualBasic.CompilerServices.IntegerType.FromString(String
Value)
at myassembly.strDate2Date(String strDate)
'-- Exception till here.

When googling I understood that the VB compiler compiles CInt into -
Microsoft.VisualBasic.CompilerServices.IntegerType::FromString(string)

So the exception is coming from one of the following lines:
CInt("01")
CInt("02")
CInt("04")
CInt("08")
CInt("11")
CInt("20")

Any idea why do I get an exception?
Do I have to use [NumberFormatInfo and CultureInfo] whenever I parse
strings to numbers?

Thanks.

Atara.
 
C

Cor Ligthert

Altara

Do you know what the problem was on that one computer with strange effects?

I am currious about that and it is as well good for this message thread when
it is searched on Google.

Cor
 
A

Atara

I do not know yet. When I will have more info I will update this thread.

Thanks Cor.

Atara.
 
A

Atara

info from another Italian client with the same error:
...
System.ArgumentException: The currency separator information specified
in the NumberFormatInfo is ambiguous for parsing.
at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String
Value, NumberFormatInfo NumberFormat)
at
Microsoft.VisualBasic.CompilerServices.IntegerType.FromString(String
Value)
at myXxx.cmcUtilities.strDate2Date(String strDate)
...

The client info:
I changed the decimal sign from dot to comma and now everithing works.

(I guess this is in -
'Control Panel' | 'Regional Options' | 'Currency'
(Atara))

The PC language is Italian as well as the operating system Windows XP.

I hope this will help others.

Atara.
 
A

Atara

To summarize:

Bug:
With some "Regional Options", any call to CInt() produces exception:
System.ArgumentException: The currency separator information
specified in the NumberFormatInfo is ambiguous for parsing.
at Microsoft.VisualBasic.CompilerServices.DoubleType.Parse(String
Value, NumberFormatInfo NumberFormat)
at
Microsoft.VisualBasic.CompilerServices.IntegerType.FromString(String
Value)

In my case it was when 'ControlPanel|Regional Options' , 'Decimal
Symbol' is a comma sign (,) .
It should be a dot sign (.) to avoid the bug.

Cause:
If any of the NumberFormatInfo group separators ( NumberGroupSeparator
| CurrencyGroupSeparator | PercentGroupSeparator)
is the same as any of the decimal separators (
NumberDecimalSeparator | CurrencyDecimalSeparator |
PercentDecimalSeparator),
Then parsing ambiguous strings produces unpredictable results.
Even when I parse simple strings with no seperators at all e.g.:
Dim myInt As integer = CInt("123")

Fix:
I started by replacing all -
' myInt = CInt(myNoInt)
with -
myInt = Integer.Parse(myNoInt)

but since I cannot replace AND test all ~100 appearances of CInt() in
my project
I added in my Main() :
Dim myCI As New System.Globalization.CultureInfo("en-US", False)
myCI.NumberFormat.NumberGroupSeparator = ","
myCI.NumberFormat.NumberDecimalSeparator = "."
' Note: This values are already set by default, but I re-set them
' for future versions that might not act the same.
System.Threading.Thread.CurrentThread.CurrentCulture = myCI

It seems that the problem was fixed.

Atara.
 
Top