summaryrefslogtreecommitdiffstats
path: root/kde/patch/kdelibs/kdelibs.klocale.numberfix.patch
blob: d27c2a303907147c11b84ffd60a1e63101889c48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
commit 2993b24bc21a340695ad35b4f014a684f4d0c651
Author: John Layt <jlayt@kde.org>
Date:   Sat Dec 17 16:27:51 2011 +0000

    KLocale: Fix readNumber() and readMoney() for lenient group parsing
    
    Restore the old pre-4.7 behaviour of accepting as valid any numbers
    that do not contain any group separators but strictly enforce group
    rules when the number contains 1 or more group separators.
    
    Distro's will really want to backport this fix to all versions of 4.7
    as previously number entry for all KDE apps would have been seriously
    broken.
    
    I'm amazed I wasn't beaten up for this earlier!
    
    BUG: 288963
    FIXED-IN: 4.7.5
    CCMAIL: kde-packager@kde.org

diff --git a/kdecore/localization/klocale_kde.cpp b/kdecore/localization/klocale_kde.cpp
index 6cf85f9..6690f4a 100644
--- a/kdecore/localization/klocale_kde.cpp
+++ b/kdecore/localization/klocale_kde.cpp
@@ -1894,7 +1894,10 @@ double KLocalePrivate::readNumber(const QString &_str, bool * ok) const
 
     // Remove group separators
     bool groupOk = true;
-    str = parseDigitGroup(str, thousandsSeparator(), decimalSymbol(), numericDigitGrouping(), &groupOk);
+    if(str.contains(thousandsSeparator())) {
+        str = parseDigitGroup(str, thousandsSeparator(), decimalSymbol(),
+                              numericDigitGrouping(), &groupOk);
+    }
 
     if (!groupOk) {
         if (ok) {
@@ -2013,7 +2016,10 @@ double KLocalePrivate::readMoney(const QString &_str, bool *ok) const
 
     // Remove group separators
     bool groupOk = true;
-    str = parseDigitGroup(str, monetaryThousandsSeparator(), monetaryDecimalSymbol(), monetaryDigitGrouping(), &groupOk);
+    if(str.contains(monetaryThousandsSeparator())) {
+        str = parseDigitGroup(str, monetaryThousandsSeparator(), monetaryDecimalSymbol(),
+                              monetaryDigitGrouping(), &groupOk);
+    }
 
     if (!groupOk) {
         if (ok) {
diff --git a/kdecore/tests/klocaletest.cpp b/kdecore/tests/klocaletest.cpp
index 97a3bce..f80de85 100644
--- a/kdecore/tests/klocaletest.cpp
+++ b/kdecore/tests/klocaletest.cpp
@@ -180,9 +180,13 @@ KLocaleTest::readNumber()
     QVERIFY(!ok);
     QCOMPARE(locale.readNumber(QString("123,456,789.01"), &ok), 0.0);
     QVERIFY(!ok);
-    QCOMPARE(locale.readNumber(QString("123456789"), &ok), 0.0);
+    QCOMPARE(locale.readNumber(QString("123456789"), &ok), 123456789.0);
+    QVERIFY(ok);
+    QCOMPARE(locale.readNumber(QString("123456789.01"), &ok), 123456789.01);
+    QVERIFY(ok);
+    QCOMPARE(locale.readNumber(QString("123456,789"), &ok), 0.0);
     QVERIFY(!ok);
-    QCOMPARE(locale.readNumber(QString("123456789.01"), &ok), 0.0);
+    QCOMPARE(locale.readNumber(QString("123456,789.01"), &ok), 0.0);
     QVERIFY(!ok);
 
     //Test it parses correctly with an empty separator.
@@ -204,6 +208,14 @@ KLocaleTest::readNumber()
     QVERIFY(ok);
     QCOMPARE(locale.readNumber(QString("123 456 789.01"), &ok), 123456789.01);
     QVERIFY(ok);
+    QCOMPARE(locale.readNumber(QString("123456789"), &ok), 123456789.0);
+    QVERIFY(ok);
+    QCOMPARE(locale.readNumber(QString("123456789.01"), &ok), 123456789.01);
+    QVERIFY(ok);
+    QCOMPARE(locale.readNumber(QString("123456 789"), &ok), 0.0);
+    QVERIFY(!ok);
+    QCOMPARE(locale.readNumber(QString("123456 789.01"), &ok), 0.0);
+    QVERIFY(!ok);
     QCOMPARE(locale.readNumber(QString("123,456,789"), &ok), 0.0);
     QVERIFY(!ok);
     QCOMPARE(locale.readNumber(QString("123,456,789.01"), &ok), 0.0);
@@ -479,6 +491,10 @@ void KLocaleTest::readMoney()
     QVERIFY(ok);
     QCOMPARE(locale.readMoney("$ 987,654,321.12", &ok), 987654321.12);
     QVERIFY(ok);
+    QCOMPARE(locale.readMoney("$ 987654321.12", &ok), 987654321.12);
+    QVERIFY(ok);
+    QCOMPARE(locale.readMoney("$ 987654,321.12", &ok), 0.0);
+    QVERIFY(!ok);
 
     QCOMPARE(locale.readMoney(          "$ -1.12", &ok),         -1.12);
     QVERIFY(ok);
@@ -498,6 +514,10 @@ void KLocaleTest::readMoney()
     QVERIFY(ok);
     QCOMPARE(locale.readMoney("$ -987,654,321.12", &ok), -987654321.12);
     QVERIFY(ok);
+    QCOMPARE(locale.readMoney("$ -987654321.12", &ok), -987654321.12);
+    QVERIFY(ok);
+    QCOMPARE(locale.readMoney("$ -987654,321.12", &ok), 0.0);
+    QVERIFY(!ok);
 
     // Test incomplete formats
     QCOMPARE(locale.readMoney(          "$ 1", &ok),         1.00);
@@ -521,17 +541,21 @@ void KLocaleTest::readMoney()
 
     // Test Grouping
     locale.d->setMonetaryDigitGrouping(QList<int>());
-    QCOMPARE(locale.readMoney( "$ 987654321.12", &ok),  987654321.12);
+    QCOMPARE(locale.readMoney("$ 987654321.12", &ok),  987654321.12);
     QVERIFY(ok);
     QCOMPARE(locale.readMoney("$ -987654321.12", &ok), -987654321.12);
     QVERIFY(ok);
     locale.d->setMonetaryDigitGrouping(QList<int>() << 3 << 2);
-    QCOMPARE(locale.readMoney( "$ 98,76,54,321.12", &ok),  987654321.12);
+    QCOMPARE(locale.readMoney("$ 98,76,54,321.12", &ok),  987654321.12);
     QVERIFY(ok);
     QCOMPARE(locale.readMoney("$ -98,76,54,321.12", &ok), -987654321.12);
     QVERIFY(ok);
+    QCOMPARE(locale.readMoney("$ 987654321.12", &ok),  987654321.12);
+    QVERIFY(ok);
+    QCOMPARE(locale.readMoney("$ -987654321.12", &ok), -987654321.12);
+    QVERIFY(ok);
     locale.d->setMonetaryDigitGrouping(QList<int>() << 3 << -1);
-    QCOMPARE(locale.readMoney( "$ 987654,321.12", &ok),  987654321.12);
+    QCOMPARE(locale.readMoney("$ 987654,321.12", &ok),  987654321.12);
     QVERIFY(ok);
     QCOMPARE(locale.readMoney("$ -987654,321.12", &ok), -987654321.12);
     QVERIFY(ok);