Skip to content

Commit 6228d70

Browse files
committed
Merge pull request #1180 from autoboosh/doubleparsefix
fix .Parse culture dependency (fixes #1178)
2 parents 1044b9c + bfcaad0 commit 6228d70

File tree

4 files changed

+32
-20
lines changed

4 files changed

+32
-20
lines changed

Rubberduck.Parsing/Preprocessing/DateLiteralExpression.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ public override IValue Evaluate()
8282
// "If L and M are numbers and R is not present:"
8383
if (L.dateValueNumber() != null && M.dateValueNumber() != null && R == null)
8484
{
85-
var LNumber = int.Parse(L.GetText());
86-
var MNumber = int.Parse(M.GetText());
85+
var LNumber = int.Parse(L.GetText(), CultureInfo.InvariantCulture);
86+
var MNumber = int.Parse(M.GetText(), CultureInfo.InvariantCulture);
8787
if (legalMonth(LNumber) && legalDay(LNumber, MNumber, CY))
8888
{
8989
month = LNumber;
@@ -116,9 +116,9 @@ public override IValue Evaluate()
116116
// "If L, M, and R are numbers:"
117117
else if (L.dateValueNumber() != null && M.dateValueNumber() != null && R != null && R.dateValueNumber() != null)
118118
{
119-
var LNumber = int.Parse(L.GetText());
120-
var MNumber = int.Parse(M.GetText());
121-
var RNumber = int.Parse(R.GetText());
119+
var LNumber = int.Parse(L.GetText(), CultureInfo.InvariantCulture);
120+
var MNumber = int.Parse(M.GetText(), CultureInfo.InvariantCulture);
121+
var RNumber = int.Parse(R.GetText(), CultureInfo.InvariantCulture);
122122
if (legalMonth(LNumber) && legalDay(LNumber, MNumber, yearFunc(RNumber)))
123123
{
124124
month = LNumber;
@@ -149,12 +149,12 @@ public override IValue Evaluate()
149149
string monthName;
150150
if (L.dateValueNumber() != null)
151151
{
152-
N = int.Parse(L.GetText());
152+
N = int.Parse(L.GetText(), CultureInfo.InvariantCulture);
153153
monthName = M.GetText();
154154
}
155155
else
156156
{
157-
N = int.Parse(M.GetText());
157+
N = int.Parse(M.GetText(), CultureInfo.InvariantCulture);
158158
monthName = L.GetText();
159159
}
160160
int monthNameNumber;
@@ -188,20 +188,20 @@ public override IValue Evaluate()
188188
if (L.dateValueNumber() == null)
189189
{
190190
monthName = L.GetText();
191-
N1 = int.Parse(M.GetText());
192-
N2 = int.Parse(R.GetText());
191+
N1 = int.Parse(M.GetText(), CultureInfo.InvariantCulture);
192+
N2 = int.Parse(R.GetText(), CultureInfo.InvariantCulture);
193193
}
194194
else if (M.dateValueNumber() == null)
195195
{
196196
monthName = M.GetText();
197-
N1 = int.Parse(L.GetText());
198-
N2 = int.Parse(R.GetText());
197+
N1 = int.Parse(L.GetText(), CultureInfo.InvariantCulture);
198+
N2 = int.Parse(R.GetText(), CultureInfo.InvariantCulture);
199199
}
200200
else
201201
{
202202
monthName = R.GetText();
203-
N1 = int.Parse(L.GetText());
204-
N2 = int.Parse(M.GetText());
203+
N1 = int.Parse(L.GetText(), CultureInfo.InvariantCulture);
204+
N2 = int.Parse(M.GetText(), CultureInfo.InvariantCulture);
205205
}
206206
int monthNameNumber;
207207
if (monthName.Length == 3)
@@ -240,22 +240,22 @@ public override IValue Evaluate()
240240
else
241241
{
242242
var timeValue = dateOrTime.timeValue();
243-
hours = int.Parse(timeValue.timeValuePart()[0].GetText());
243+
hours = int.Parse(timeValue.timeValuePart()[0].GetText(), CultureInfo.InvariantCulture);
244244
if (timeValue.timeValuePart().Count == 1)
245245
{
246246
mins = 0;
247247
}
248248
else
249249
{
250-
mins = int.Parse(timeValue.timeValuePart()[1].GetText());
250+
mins = int.Parse(timeValue.timeValuePart()[1].GetText(), CultureInfo.InvariantCulture);
251251
}
252252
if (timeValue.timeValuePart().Count < 3)
253253
{
254254
seconds = 0;
255255
}
256256
else
257257
{
258-
seconds = int.Parse(timeValue.timeValuePart()[2].GetText());
258+
seconds = int.Parse(timeValue.timeValuePart()[2].GetText(), CultureInfo.InvariantCulture);
259259
}
260260
var amPm = timeValue.AMPM();
261261
if (amPm != null && (amPm.GetText().ToUpper() == "P" || amPm.GetText().ToUpper() == "PM") && hours >= 0 && hours <= 11)

Rubberduck.Parsing/Preprocessing/NumberLiteralExpression.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public NumberLiteralExpression(IExpression tokenText)
1414
public override IValue Evaluate()
1515
{
1616
string literal = _tokenText.Evaluate().AsString;
17-
var number = decimal.Parse(literal.Replace("#", "").Replace("&", "").Replace("@", ""), NumberStyles.Float);
17+
var number = decimal.Parse(literal.Replace("#", "").Replace("&", "").Replace("@", ""), NumberStyles.Float, CultureInfo.InvariantCulture);
1818
return new DecimalValue(number);
1919
}
2020
}

Rubberduck.Parsing/VBA/RubberduckParser.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using Rubberduck.VBEditor;
1818
using Rubberduck.VBEditor.Extensions;
1919
using Rubberduck.Parsing.Preprocessing;
20+
using System.Globalization;
2021

2122
namespace Rubberduck.Parsing.VBA
2223
{
@@ -224,8 +225,8 @@ private void ParseInternal(VBComponent vbComponent, string code, CancellationTok
224225
};
225226

226227
token.ThrowIfCancellationRequested();
227-
228-
var preprocessor = new VBAPreprocessor(double.Parse(_vbe.Version));
228+
229+
var preprocessor = new VBAPreprocessor(double.Parse(_vbe.Version, CultureInfo.InvariantCulture));
229230
string preprocessedModuleBody;
230231
try
231232
{

RubberduckTests/Preprocessing/VBAPreprocessorVisitorTests.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1088,7 +1088,7 @@ public void TestOperatorPrecedence()
10881088
}
10891089

10901090
[TestMethod]
1091-
public void TestLocale()
1091+
public void TestLocaleJapanese()
10921092
{
10931093
string code = @"
10941094
#Const a = CDate(""2016/03/02"")
@@ -1104,6 +1104,17 @@ public void TestLocale()
11041104
Assert.AreEqual(true, result.Item1.Get("d").AsBool);
11051105
}
11061106

1107+
[TestMethod]
1108+
public void TestLocaleGerman()
1109+
{
1110+
string code = @"
1111+
#Const a = 82.5235
1112+
";
1113+
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("de-de");
1114+
var result = Preprocess(code);
1115+
Assert.AreEqual(82.5235m, result.Item1.Get("a").AsDecimal);
1116+
}
1117+
11071118
[TestMethod]
11081119
public void TestPreprocessingLiveDeadCode()
11091120
{

0 commit comments

Comments
 (0)