Hi everybody, this is my second topic upon that issue. The first one was here: http://forums.autodesk.com/t5/Autodesk-Inventor/iLogic-inputbox-only-decimal-value-with-coma-not-wit...
To resume the issue here, my problem is that I did, a couple of months ago, a part with a rule containing some input boxes. It worked without a bug and set it as a specific template, on Inventor 2012.
I tried to reuse it as a template without changing its rule on Inventor 2013. When the input box pops out and ask the value it needs, if I type "0.2" it says that "string's conversion "0.2" in a 'double' type isn't valid". But if I type "0,2" I have absolutely no problems.
And on the "more infos" tab, I can see that message:
"System.InvalidCastException: La conversion de la chaîne "0.2" en type 'Double' n'est pas valide. ---> System.FormatException: Le format de la chaîne d'entrée est incorrect.
à Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(String Value, NumberFormatInfo NumberFormat)
à Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(String Value, NumberFormatInfo NumberFormat)
--- Fin de la trace de la pile d'exception interne ---
à Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(String Value, NumberFormatInfo NumberFormat)
à LmiRuleScript.Main()
à Autodesk.iLogic.Exec.AppDomExec.ExecRuleInAssembly(Assembly assem)
à iLogic.RuleEvalContainer.ExecRuleEval(String execRule) "
I work on:
Windows 7
Autodesk design suite premium 2013 french.
Solved! Go to Solution.
Solved by MegaJerk. Go to Solution.
Does the code below error out for you, when you type in 0.2 ?
Dim iString As String Dim iDoub As Double '''/////////// Let's ask the user to type something in iString = InputBox("Super String Converter-o-Matic 2012", "Strings --> Doubles!", "") '''/////////// If the input can be succesfully considered a number, then we proceed If IsNumeric(iString) = True Then '''/////////// If it is a number, we'll set our variable 'iDoub' to equal the String, converted over '''/////////// into a double iDoub = CDbl(iString) '''/////////// Now we show you the result MessageBox.Show("Your Double Is : " & iDoub, "Converted!") Else '''/////////// If the variable 'iString' can't be considered to have a numeric value, then we '''/////////// tell the user that we can't convert their input MessageBox.Show("We can't convert letters to numbers! We have standards!", "Not-Converted!") End If
Hi Megajerk, Thanks for your answer.
So It doesn't error me out, it says your message "We can't convert letters to numbers! We have standards!"
Makes me smile.
So must I apply it to my code?
Actually, if you're getting that message when you type in 0.2 (zero point two), then there certainly is something wrong.
Try the following code and tell me the values that it returns back to you in the final box.
Dim oBlah,oLaLa As String Dim oDarn As Char oBlah = InputBox("Input your string", "String Detective", "") For Each oDarn In oBlah If oLaLa = "" Then oLaLa = (Asc(oDarn)) Else oLaLa = oLaLa & "," & (Asc(oDarn)) End If Next MessageBox.Show(oLaLa,"String Detective Has Found This!")
So when you run that code, type in your 0.2, and tell me what three numbers you get back.
Well that’s what you should be getting. You may have a rather unique problem on your hand being that you’re input of 0.2 is producing the correct Ascii values (48,46,50), but the function ‘IsNumeric’ is refusing to accept that as a proper numeric value (despite the fact that it is).
Perhaps someone from Autodesk would be willing to dig deeper into this. Perhaps it’s a localization bug.
I’m sorry that I couldn’t be more useful.
Hi again everybody, after looking a bit more on the web, it seems that this issue is not related to inventor, but to visual basic. Some people have the same kind of problem, but on other software. But I'm searching, and nobody seems to have a real solution. Could someone help me?
Does the following code give you the "Unable to parse" or does it return a message box with the correct numerical value in it?
Dim value As String Dim result As Decimal value = "0.2" If Decimal.TryParse(value, result) MessageBox.Show(result) Else MessageBox.Show("Unable to parse: " & value,"") End If
(That is for ilogic)
I just couldn’t stop thinking about this. I feel that I might have cracked it finally. Here is some ilogic code that will force it to try in both French and UK English localizations. This should allow for either a comma or a decimal point for string input. You can of course set it to only do or the other using further logic, but I think that this should get us on the correct track… or at least I hope. Tell me the results of the following code.
Imports System.Globalization Dim value As String Dim style As NumberStyles Dim FRculture, UKculture As CultureInfo Dim oNumber As Decimal ' Parse currency value using en-GB culture. value = "0.2" style = NumberStyles.AllowDecimalPoint Or NumberStyles.AllowCurrencySymbol 'culture = CultureInfo.CreateSpecificCulture("en-GB") 'USculture = CultureInfo.CreateSpecificCulture("en-US") FRculture = CultureInfo.CreateSpecificCulture("fr-FR") UKculture = CultureInfo.CreateSpecificCulture("en-UK") If Decimal.TryParse(value, style, FRculture, oNumber) = True Or Decimal.TryParse(value, style, UKculture, oNumber) = True Then MessageBox.Show("Converted : "& value & " --> To --> " & oNumber,"") Else MessageBox.Show("Unable to convert : "& value, "") End If
I really appreciate your work about this.
So, the answer is that 0.2 has been converted to 0,2!
Thank you so much! But now I'm not sure to understand which part of your code I must re-use in mine, and if y must do it everytime I need to enter a value (but I guess that yes, i must.)
I couldn't work on a better response during work hours, but I did manage to make this code to give you an example of a way you could implement this. I will write something better tomorrow. Sorry 😄
'Your Imports would be first. Imports System.Globalization Sub Main () 'All of your main code would go here, right under the Sub Main() Dim UserInput As String Dim oNumber As Decimal UserInput = InputBox("Please Enter A Number", "ACME Number Machine", "") If UserInput <> "" Then oNumber = NumberMuncherUK(UserInput) MessageBox.Show(oNumber,"") Else MessageBox.Show("Blank Entry","Error") End If End Sub Function NumberMuncherUK (IncString As String) As Decimal Dim RetVal As Decimal Dim style As NumberStyles Dim UKculture As CultureInfo 'Dim FRculture As CultureInfo 'FRculture = CultureInfo.CreateSpecificCulture("fr-FR") style = NumberStyles.AllowDecimalPoint UKculture = CultureInfo.CreateSpecificCulture("en-UK") If Decimal.TryParse(IncString, style, UKculture, RetVal) = False RetVal = -1.0 End If Return RetVal End Function
Basically you would just call that function every time you wanted to see if the user input a correct value before passing it along. It returns a -1 (or whatever value you would like) so that you can use that in your logic down the road.
If UserInput = -1 Then
MessageBox.Show("You input a silly number!","")
End If
So on and so forth.
Okay, thanks a lot.
I'm not sure to fully understand so I tried to do use this like this:
Imports System.Globalization Sub Main () Dim Module As String Dim oModule As Decimal Module = InputBox("Entrez le module du pignon:","NIHS 20-02","") If Module <> "" Then oModule = NumberMuncherUK(Module) End If Dtete=oModule*(25+1.44) Dprimitif=oModule*25 Dfond=oModule*(25-3.5) Epaisseur_s=1.41*oModule Rogive=0.8*1.44*oModule Distance_t=Rogive-(Epaisseur_s/2) End Sub Function NumberMuncherUK (IncString As String) As Decimal Dim RetVal As Decimal Dim style As NumberStyles Dim UKculture As CultureInfo 'Dim FRculture As CultureInfo 'FRculture = CultureInfo.CreateSpecificCulture("fr-FR") style = NumberStyles.AllowDecimalPoint UKculture = CultureInfo.CreateSpecificCulture("en-UK") If Decimal.TryParse(IncString, style, UKculture, RetVal) = False RetVal = -1.0 End If Return RetVal End Function
But when it is compilating, it says that: "Value" isn't a member of "String".
Actually, there are a few problems. You are using a dim called “Module” which is a reserved keyword in VB.net, and is the reason it turns up as a red color. I have rewritten your code, and it is working on my machine, but you will of course need to test it on yours. Notice how I also moved the calculations that are based on the user input to under the ‘If uModule <> "" Then’ ? That’s so that they don’t calculate using user input that hasn’t passed the condition check (the condition check in this case being the user input field being left empty or not).
Let’s see if the following will work correctly on your machine.
Imports System.Globalization
Sub Main ()
Dim uModule As String
Dim oModule As Decimal
uModule = InputBox("Entrez le module du pignon:","NIHS 20-02","")
If uModule <> "" Then
oModule = NumberMuncherUK(uModule)
If oModule <> -1 Then
Dtete=oModule*(25+1.44)
Dprimitif=oModule*25
Dfond=oModule*(25-3.5)
Epaisseur_s=1.41*oModule
Rogive=0.8*1.44*oModule
Distance_t=Rogive-(Epaisseur_s/2)
MessageBox.Show(DTete & " - " & Dprimitif & " - " & Dfond & " - " & Epaisseur_s & " - " & Rogive & " - " & Distance_t, "")
Else
MessageBox.Show("There has been a conversion problem from string to Decimal. Please Try Again.","")
End If
Else
MessageBox.Show("You've left the input blank. Please start over.", "Blank Input Error")
End If
End Sub
Function NumberMuncherUK (IncString As String) As Decimal
Dim RetVal As Decimal
Dim style As NumberStyles
Dim UKculture As CultureInfo
'Dim FRculture As CultureInfo
'FRculture = CultureInfo.CreateSpecificCulture("fr-FR")
style = NumberStyles.AllowDecimalPoint
UKculture = CultureInfo.CreateSpecificCulture("en-UK")
If Decimal.TryParse(IncString, style, UKculture, RetVal) = False
RetVal = -1.0
End If
Return RetVal
End Function
I should also say that the only option in my ilogic editor that is checked is Silent Operation. I would suggest making sure you don’t have Straight VB code checked.
So I try it at on my machine.
And I managed to make it work! Thank you!
I just need now to do it on every value! Thank you once again!
That’s just great! In the spirit of uncovering more information about how this problem came about, I wanted to ask you a few questions. Which version of Inventor were you using before you had this localization problem? Was it localized in French, or was it an English language package? Was your computer set up with a different localization for the past / present Inventor installation, or has it always been set to French language?
If it seems that everything stayed the same, and only the Inventor version (from 2012 to 2013) made the difference, then they’ve changed how they calculate things based on the language culture, which would be righteous information to have if someone out there in developer land started to work on a plug-in / iLogic code that could potentially be used internationally.
Any who, thanks for your time! Continue to post in the customization forums if any other problems (or neat discoveries) arise.
The version before was only Inventor 2012 in French. Nothings changed about it. I just have uninstalled the old one and install the new version. But if you remember, I have said that, checking on google, some people have the same issue, same error, with visual basic editors like iLogic on inventor, but on other software. So I'm wondering if it could be something with an update of windows 7 (I always had windows 7, but sometimes updates create some bugs here, I don't know).
I'm just wondering that in your code, you used "Style = NumberStyles.AllowDecimalPoint" . Don't you know if it's possible, at some point, to use this in the begining of the code to make it apply for every value next, automatically? Sorry, as I said, I'm not familiar with programmation, I'm learning by doing simple stuff.
I’m glad that you asked. Yes there is a way to change the entire document’s culture info. The reason I didn’t go that route before was because I didn’t know if you had some users that were going to be using the ‘,’ decimal point and some that may use the ‘.’ point. With that being said, the following example will show you how to set up a main culture across your entire document, as well as some other information that you may find useful. If you have any other questions about this code, or anything else related, feel free to ask. This has been a real learning experience!
Imports System.Globalization Imports System.Threading Dim value, userInputString As String Dim userInputDouble As Double Dim InputBool As Boolean Dim oNumber As Decimal 'Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR") ''' French language culture! Thread.CurrentThread.CurrentCulture = New CultureInfo("en-GB") ''' English language (with a UK twist!) 'Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US") ''' English language (with a Southern Twang!) 'Thread.CurrentThread.CurrentCulture = New CultureInfo("de-DE") ''' German language from the Father Land! '''///////////////////////////////////////////////////////////////////////////////////////////////////// ''' ''' Here are some culture codes ''' ''' en-GB - (English - Great Britain) ''' en-US - (English - United States) ''' fr-FR - (French - France) ''' de-DE - (German - Germany) ''' ''' ''' Simply replace the above 'New CultureInfo("??-??") with one of the codes to change ''' how this document reacts. ''' ''' More culture codes can be found here : ''' ''' http://msdn.microsoft.com/en-us/library/System.globalization.cultureinfo(v=vs.71).aspx ''' '''///////////////////////////////////////////////////////////////////////////////////////////////////// ''' ''' '''///////////////////////////////////////////////////////////////////////////////////////////////////// ''' ''' In this comment section are some simple tests to see if your current culture is working ''' based on if the following value returns true or false. ''' ''' Uncomment the code section you'd like to test with, if you'd like to test. ''' Only uncomment *one*. Specifically the one pertaining to the culture that you've set. ''' ''' (Test for ENGLISH language culture. Should return true) ''' ''' value = "0.2" ''' ''' If IsNumeric(value) = True Then ''' Messagebox.Show("True","") ''' Else ''' MessageBox.Show("False","") ''' End If ''' ''' ''' (Test for NON-ENGLISH language culture. Should return true) ''' ''' value = "0,2" ''' ''' If IsNumeric(value) = True Then ''' Messagebox.Show("True","") ''' Else ''' MessageBox.Show("False","") ''' End If ''' '''///////////////////////////////////////////////////////////////////////////////////////////////////// InputBool = False While InputBool = False userInputString = InputBox("Please Enter a Number. Your Current Culture is set to : " _ & Thread.CurrentThread.CurrentCulture.Name, "Title", "") If IsNumeric(userInputString) = True Then InputBool = True userInputDouble = CDbl(userInputString) Else InputBool = False MessageBox.Show("The number you entered - " & userInputString & _ " - was not recognized as valid. Please try again.","") End If End While MessageBox.Show("Your input, multiplied by 2 = " & userInputDouble * 2, "Result")
I should note that there was a small error in my last code posts. I called out the culture info as “en-UK” when it should have been “en-GB” for English-Great Britain. Oops.
Can't find what you're looking for? Ask the community or share your knowledge.