[Kmymoney-devel] Another locale puzzle - CSV Importer

Thomas Baumgart thb at net-bembel.de
Fri May 30 12:10:27 UTC 2014


Allen,

On Friday 30 May 2014 12:25:10 Allan wrote:

> Hi Thomas
> 
> On 30/05/14 07:00, Thomas Baumgart wrote:
> > Hi Allen,
> > 
> > On Thursday 29 May 2014 12:36:42 Allan wrote:
> >> Previously, I dealt successfully with importing with a user's locale,
> >> but now I'm hitting a problem.
> >> 
> >> I'm working on a patch to fix "[Bug 334995] CSV import Debit/Credit mode
> >> only looks at one column, credits become 0.00".  I have the patch
> >> working for my own locale - UK.  However, for other locales, I converted
> >> my test file to use comma decimal and semi-colon separator.  This is
> >> giving me grief.  What I'm trying to do is to convert a QString currency
> >> amount to double, to be able to test if the amount is non-zero, as
> >> against empty.
> >> 
> >> The basic problem came as a surprise, when I found that QString was not
> >> locale-aware.  I'm getting caught between QLocale and KLocale.  I am
> >> setting the country to, say, France.  However, QLocale still seems to be
> >> set to UK.  Things seem to work if I set QLocale::default() to France,
> >> but how do I know which country the user is in?
> >> 
> >> It looks like QLocale doesn't take account of KDE country change, but
> >> retains the original system locale.  How can I get the KDE locale to
> >> give a country that QLocale will accept?
> >> 
> >> Or, am I missing the simple answer?
> > 
> > Doesn't KLocale::readMoney(const QString &numStr, bool * ok) work for you?
> 
> Sadly, no.
> 
> In the importer, when importing a comma symbol file, the comma becomes a
> dot.
> 
> As a quick test, if I do -
> 
> bool OK;
>        KLocale* loc = KGlobal::locale();
>        QString str1 = "123.45";
>        QString str2 = "123,45";
>        qDebug()<<"QIFProc"<<(QString::number(loc->readMoney(str1, &OK),
> 'f', 2))<<loc->country()<<loc->countryCodeToName(loc->country());
> 
> qDebug()<<"QIFProc"<<loc->readMoney(str2)<<loc->country()<<loc->countryCodeT
> oName(loc->country());
> 
> the first fails, and the second gives -
> 
> QIFProc "123.45" "fr" "France".
> 
> So, it's picking up my current locale of France, but converts to UK (my
> normal locale) for some reason.
> 
> I can't see what I'm doing wrongly.  Help!

I expect the first one fails, because the number does not match the format 
required by the locale (French).

The second one is a bit tricky:

loc->readMoney() is supposed to return a double.  Using that one in a debug 
stream as you do, uses the standard Qt functions to convert it into a string 
(I doubt they are locale aware). So I expect the problem to be right there.

What happens, if you use

  qDebug() << QLocale::toCurrencyString(loc->readMoney(str, ok));

or

  qDebug() << QLocale::toString(loc->readMoney(str, ok), 'f', 2);

Does that print the value with a comma? Or stick with KLocale::formatMoney(). 
I am really not sure, what you try to achieve. 

-- 

Regards

Thomas Baumgart

GPG-FP: E55E D592 F45F 116B 8429   4F99 9C59 DB40 B75D D3BA
-------------------------------------------------------------
Progress isn't made by early risers. It's made by lazy men
trying to find easier ways to do something. -- Robert Heinlein
-------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 225 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.kde.org/pipermail/kmymoney-devel/attachments/20140530/37053971/attachment.sig>


More information about the KMyMoney-devel mailing list