Kommata im Float?

  • Kommata im Float?

    Ich habe Variablen die Preise in Strings [in einem Array] gespeichert haben.


    Preise sind im Format:

    ##,##
    ###,##
    ####,##

    gespeichert als Strings.

    Ich speichere die Strings in einem Float:


    Quellcode

    1. float FloatSumme = 0;
    2. ...
    3. ...
    4. ...
    5. FloatSumme = [InhaltString floatValue];



    Wenn ich mir das ganze jetzt testweise ansehe mit

    NSLog(@"Preis: %f", FloatSumme)


    wird aus 77,50 eine 77.000000

    aus 44,89 wird 44.000000


    Ich gehe mal davon, dass es damit Zusammenhängt, dass die Amerikaner dass , als 1.000 Trennzeichen nehmen, und statt einem Kommata einen Punkt erwarten.


    Daher 2 wahrscheinlich leichte Fragen:
    1] wie übergebe ich den String so, dass Objective-C das , korrekt erkennt. Soll ich vorher per Funktion , durch . ersetzen, oder gibt es da schon was fertiges für on-the-fly?

    2] wie kann ich unter Objective-C die Nachkomma-Stellen im Float auf 2 beschränken und kaufmännisch runden?
  • RE: Kommata im Float?

    Original von BlackBerryUser
    Ich habe Variablen die Preise in Strings [in einem Array] gespeichert haben.
    [...]
    Ich speichere die Strings in einem Float:

    Ein FLOAT ist eine Fließpunktzahl. Schon immer gewesen.
    Wozu soll das genau gut sein?

    Der Sinn der Umwandlung von NSString in FLOAT erschließt sich mir nicht.

    Wenn es immer zwei Nachkommastellen sind geht aus NSDecimal.
    Wenn es Geldwerte (Euro, Dollar, halbe Kilo - nee; Pfund) sein sollen, speicher lieber die kleinste benötigte Einheit als INT.

    Fließpunktzahlen lassen sich nicht kaufmännisch runden, sie sind dafür zu ungenau.
    NSDecimal sollte das können, definitiv getestet habe ich das aber nicht.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Original von BlackBerryUser
    ich denke, dass int hier ungeeignet ist, da keine Nachkomma-Stellen?

    Du kannst einen int auch als Fixkomma-Zahl interpretieren, aber Lucas de Vil hat Recht: NSDecimal und NSDecimalNumber sind Deine Freunde - die sind bis zu einer Sextillion auf den Cent genau, danach könnte man die Nachkommastellen eventuell vernachlässigen...
    Multigrad - 360°-Produktfotografie für den Mac
  • RE: Kommata im Float?

    Original von Lucas de Vil
    Original von BlackBerryUser
    Wenn es Geldwerte (Euro, Dollar, halbe Kilo - nee; Pfund) sein sollen, speicher lieber die kleinste benötigte Einheit als INT.



    int hab ich probiert, obwohl ich mir schon dachte, dass es falsch ist.
    INT schneidet mir die nachkomma - Werte ab. somit falsch. bzw. nicht dass was ich brauche. Ich brauche ja nicht nur Euro sondern auch die Cents.
  • RE: Kommata im Float?

    Original von BlackBerryUser
    INT schneidet mir die nachkomma - Werte ab. somit falsch. bzw. nicht dass was ich brauche. Ich brauche ja nicht nur Euro sondern auch die Cents.

    Ein int ist eine Ganzzahl, deshalb gibt es keine Nachkommastellen (daher wohl auch der Name).
  • Original von BlackBerryUser
    ich denke, dass int hier ungeeignet ist, da keine Nachkomma-Stellen?

    Naja, wo genau zahlt man denn mit Centbeträgen mit Nachkommastellen???
    Nicht mal an der Tankstelle, obwohl die das so ausweisen...

    Deshalb schrob ich 'speicher lieber die kleinste benötigte Einheit als INT'.
    Also nicht 3,45 Euro als FLOAT sondern 345 Cent als INT.
    Und nicht 5,45kg sondern 5450g etc. pp.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Original von BlackBerryUser
    ganz einfach: ich habe die Menge als String und ich habe den Preis als String.

    Das ist natürlich falsch. Die Menge ist ein int und Preis float, bzw. decimal, dadurch entfällt auch die konvertiererei.
    Das kaufmännische runden kannst Du doch selbst machen.
  • Original von Lucas de Vil
    Original von BlackBerryUser
    ich denke, dass int hier ungeeignet ist, da keine Nachkomma-Stellen?

    Naja, wo genau zahlt man denn mit Centbeträgen mit Nachkommastellen???
    Nicht mal an der Tankstelle, obwohl die das so ausweisen...

    Deshalb schrob ich 'speicher lieber die kleinste benötigte Einheit als INT'.
    Also nicht 3,45000 Euro als FLOAT sondern 345 Cent als INT.
    Und nicht 5,45kg sondern 5450g etc. pp.

    Es liegt wohl daran, dass die Werte so eingegeben werden:
    3,45 EURO
    5,45 kg
    Man müsste das halt alles wieder umrechnen (in deiner Version), was meiner Meinung nach unnötig ist. Das Gerümpel
    als float gespeichert und feddich.
  • Original von wolf_10de
    Original von BlackBerryUser
    ganz einfach: ich habe die Menge als String und ich habe den Preis als String.

    Das ist natürlich falsch. Die Menge ist ein int und Preis float, bzw. decimal, dadurch entfällt auch die konvertiererei.
    Das kaufmännische runden kannst Du doch selbst machen.



    falsch verstanden:

    wenn ich die Daten übergeben bekomme sind es Strings,
    daher will ich diese ja in float umwandeln. Genau das war ja der Ausgangspunkt meiner Frage.
  • Original von wolf_10de
    Es liegt wohl daran, dass die Werte so eingegeben werden:
    3,45 EURO
    5,45 kg
    Man müsste das halt alles wieder umrechnen (in deiner Version), was meiner Meinung nach unnötig ist. Das Gerümpel
    als float gespeichert und feddich.


    genau, das war doch am Anfang meine Frage?

    Ich habe die Werte als String, und will diese umwandeln in float damit ich damit rechnen kann.
  • Original von BlackBerryUser
    Original von wolf_10de
    Original von BlackBerryUser
    ganz einfach: ich habe die Menge als String und ich habe den Preis als String.

    Das ist natürlich falsch. Die Menge ist ein int und Preis float, bzw. decimal, dadurch entfällt auch die konvertiererei.
    Das kaufmännische runden kannst Du doch selbst machen.



    falsch verstanden:

    wenn ich die Daten übergeben bekomme sind es Strings,
    daher will ich diese ja in float umwandeln. Genau das war ja der Ausgangspunkt meiner Frage.

    Na dann nimm doch [meinString floatValue];
  • Original von wolf_10de
    Na dann nimm doch [meinString floatValue];

    Dann hats doch wieder nen Punkt an Stelle eines Kommas.
    Wir drehen uns im Kreis. ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Original von Lucas de Vil
    Original von wolf_10de
    Na dann nimm doch [meinString floatValue];

    Dann hats doch wieder nen Punkt an Stelle eines Kommas.
    Wir drehen uns im Kreis. ;)


    Ok, das wurde dann doch aber schon erwähnt: NSDecimal, bzw. locale.
  • Original von mattik
    Gib' mal im Suchfeld (das auf der Portalseite, wo "erst suchen dann fragen" steht) die Wörter "Komma Punkt" ein. Dann bekommst Du als Ergebnis u.a. diesen Thread, in dem die Komma-statt-Punkt-Problematik beschrieben und gelöst wird.

    Mir war doch, als hätten wir das erst kürzlich schon mal gehabt. ;)
  • eine andere Lösung könnte auch so aussehen:

    im String alle ',' durch '.' ersetzen - immer!
    Dann kann man ihn mit "floatValue" in eine Fliesskommazahl wandeln.

    Allerdings EUR- und Ct-Beträge nicht mit float oder double rechen! Die Fehler durch das Runden sind nicht zu vernachlässigen.

    Lieber mit NSDecimalNumber und + (NSDecimalNumber *)decimalNumberWithString:(NSString *)numericString diesen String weiter verarbeiten. Zum rechenen mit "Decimalen" gibt es NSDecimalMultiply, NSDecimalAdd usw.
    Wenn Du immer nur das tust was du schon kannst - wirst du immer das bleiben, was du heute bist.
  • Original von mattik
    Original von BlackBerryUser
    ich frag doch nicht, wenns so einfach wäre. :P

    Gib' mal im Suchfeld (das auf der Portalseite, wo "erst suchen dann fragen" steht) die Wörter "Komma Punkt" ein. Dann bekommst Du als Ergebnis u.a. diesen Thread, in dem die Komma-statt-Punkt-Problematik beschrieben und gelöst wird.


    Das Script, dass Du dort angeboten hast ist aber die andere Richtung.

    float zu String.

    Ich will doch vom String zum float.