chrissy: Text in Zahl umwandeln abhängig von Sprache

Hallo,

Eigentlich dachte ich, dass es reicht, wenn ich bei meinem Textfeld einfach onblur="this.value = parseFloat(this.value)" aufrufe, aber leider scheint das nicht so.
Grundsätzlich wird für eine Dezimalzahl da ja der Punkt als Dezimaltrenner erwartet, leider erwartet aber meine Datenbank das Format entsprechend der Spracheinstellung. Also für Englisch = Punkt, für Deutsch = Komma.
Habe ich irgendwie (ohne Applet) eine Chance meine Zahl entsprechend der Sprache zu konvertieren?

Schon mal danke für eure Hilfe,
chrissy

  1. Hallo,

    Habe ich irgendwie (ohne Applet) eine Chance meine Zahl entsprechend der Sprache zu konvertieren?

    Wenn du die Sprache jeweils kennst, kannst du das Dezimalzeichen vor dem Eintrag in die Datenbank mit replace() entsprechend ersetzen.

    Gruß, Don P

    1. Hallo,

      Habe ich irgendwie (ohne Applet) eine Chance meine Zahl entsprechend der Sprache zu konvertieren?

      Wenn du die Sprache jeweils kennst, kannst du das Dezimalzeichen vor dem Eintrag in die Datenbank mit replace() entsprechend ersetzen.

      Gruß, Don P

      Jo oder einfach alle Punke durch Kommas ersetzen, hintenrum abschneiden wenn nötig (falls jemand tausenderstellen eingibt) und wieder zusammenkleben. So quasi:

        
      <script type="text/javascript">  
      var parseInput = function (obj)  
      {  
       var v = obj.value.replace(/\./g, ","); // alle punkte raus  
       var hasDez = v.lastIndexOf(',');  
       if (hasDez != -1)  
       {  
        nrInt = v.substring(0, hasDez).replace(/,/g, ""); // restliche kommas raus  
        nrDez = v.substring(hasDez, hasDez+3);  
        obj.value = (nrInt+nrDez); // zampeppen  
       }  
      }  
      </script>  
      <input type="text" onblur="parseInput(this);return false;" />  
      
      
      1. Danke erstmal für die Antworten ...

        @Marshall: Einfach Komma durch Punkt ersetzen, ist wie gesagt, nicht die Lösung die funktioniert, da meine Datenbank das Zahlenformat erwartet, das in den Regionaloptionen eingestellt.

        @Alexander: Die Idee hatte ich auch schon, leider kenne ich nicht alle eingestellten Sprachen meiner Benutzer ... und ich müßte ja jede abfangen. Aber für den ersten Ansatz, werde ich wohl doch damit arbeiten müssen.

        @Don: Das ich mit replace() ersetzen kann, ist mir schon klar, aber woher kenne ich das Dezimalzeichen??? Dies ist der Schritt der mir eigentlich fehlt.

        Ich werde das Gefühl nicht los, das ich doch irgendwie mit den Java-Klassen (DecimalFormat) arbeiten muss.
        Wenn irgendjemand weiß, wie ich dass mache (leider habe ich da drin gar keine Ahnung), bitte bitte ein Beispiel ...

        chrissy

        1. @Don: Das ich mit replace() ersetzen kann, ist mir schon klar, aber woher kenne ich das Dezimalzeichen??? Dies ist der Schritt der mir eigentlich fehlt.

          Das kannst du nicht kennen, es sei denn du hast irgendwie die Möglichkeit den Nutzer zu fragen oder hellzusehen.

          Ersetzen bringt dir auch nicht immer den gewünschten Erfolg, da Punkt und Komma in den Variationen einfach vertauscht sind.
          1,000,000.99
          1.000.000,99

          Wie Alexander schon sagte, einfach versuchen die eingestellte Sprache auszulesen und dann von der entsprechenden Formatierung ausgehen.

          Ich werde das Gefühl nicht los, das ich doch irgendwie mit den Java-Klassen (DecimalFormat) arbeiten muss.

          die können Hellsehen?

          Struppi.

          1. Moin Moin!

            Ich werde das Gefühl nicht los, das ich doch irgendwie mit den Java-Klassen (DecimalFormat) arbeiten muss.

            die können Hellsehen?

            Nö, aber sie haben vermutlich eine gut gepflegte Datenbasis für solche Fälle. Auch andere Systeme müssen solche Informationen vorhalten. Ich würde mal versuchen, beim GNU-Projekt was passendes zu finden (Stichwort: i18n, l10n), das müßte in irgendeiner Library stecken, mit den eigentlichen Daten in einer Text-Datei, die direkt eingelesen oder bei der Installation in ein Binärformat konvertiert wird. (Gilt natürlich auch für Java-Klassen, sofern man an die Sources herankommt.)

            http://search.cpan.org/modlist/Internationalization_Locale könnte auch hilfreich sein, und sei es nur als Stichwortgeber.

            Alexander

            --
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
            1. Hallo,

              @Don: ich arbeite mit Oracle Application Express, zwar weiß ich dass in das die Datenbank '.' einen Punkt erwartet, aber ApEx scheint intern eine Funktion laufen zu lassen, die Zahlen entsprechend umformatiert.
              Das heißt, wenn mein Browser auf Deutsch steht, erwartet ApEx ein Komma, wenn der Browser auf Englisch steht einen Punkt etc.
              Nun mache ich aber Berechnungen mit Javascript und mache daher einen replace Komma gegen Punkt, aber fürs Schreiben in die Datenbank muss ich den Punkt wieder zurücktauschen wenn notwendig.

              @Struppi: DecimalFormat kann nicht hellsehen, aber man kann lokale einstellungen setzen und entsprechend den DecimalSeparator abfragen.

              Ich habe jetzt folgende Lösung:

              function myFunction()
              {
                var el1 = document.getElementById('TEST1').value;

              if (el1.indexOf('.') != -1)
               {
                 var lang = document.getElementsByTagName("html")[0].getAttribute('lang');
                 if (lang.indexOf("-") != -1)
                   lang = lang.substring(0, lang.indexOf("-"));
                 var pDec = new java.text.DecimalFormatSymbols(new java.util.Locale(lang));
                 var pSep = String.fromCharCode(pDec.getDecimalSeparator());

              el1.replace(/./g, pSep);
              }

              Im Moment ersetzt er zwar noch falsch, aber das wird schon noch werden.

              Danke für eure Hilfe
              chrissy

              1. Hallo,

                Das heißt, wenn mein Browser auf Deutsch steht, erwartet ApEx ein Komma, wenn der Browser auf Englisch steht einen Punkt etc.

                Ach so... Dann könntest du doch einfach die Browser-Sprache mit navigator.language() (bzw. browserLanguage für IE) ermitteln und entsprechend reagieren, z.B. so:

                  
                var komma = function() {  
                  
                  switch (navigator.language || navigator.browserLanguage) {  
                  
                    case 'en':  
                      return '.';  
                  
                    case 'de':  
                      return ',';  
                  }  
                  
                  return '.';  
                }  
                
                

                Diese Funktion komma() liefert dir das richtige "Komma".

                Gruß, Don P

        2. Hallo,

          @Don: Das ich mit replace() ersetzen kann, ist mir schon klar, aber woher kenne ich das Dezimalzeichen??? Dies ist der Schritt der mir eigentlich fehlt.

          Das verstehe ich nicht. Das Dezimalzeichen wird doch, wie du schreibst, von deiner Datenbank vorgeschrieben, oder doch nicht? Du kennst also die Datenbank nicht, d.h. du weißt nicht, für welche Sprache die konfiguriert ist? Warum nicht? Ändert sich denn das jeden Tag? Fragen über Fragen....

          Gruß, Don P

    2. Moin Moin!

      Hallo,

      Habe ich irgendwie (ohne Applet) eine Chance meine Zahl entsprechend der Sprache zu konvertieren?

      Wenn du die Sprache jeweils kennst, kannst du das Dezimalzeichen vor dem Eintrag in die Datenbank mit replace() entsprechend ersetzen.

      navigator.language wäre ein Ansatz, die aktuelle Sprache herauszufinden -- oder jeweils das, was der Anwender in einer Web-Anwendung vorher eingestellt hat.

      Für den Weg von lokal zu Computer reicht es aus, zunächst 100er/1000er-Trennzeichen (de: Punkt, en: Komma) und ggf. Leerzeichen  zu entfernen, dann das Dezimaltrennzeichen (de: Komma, en: Punkt) durch einen Punkt zu ersetzen.

      Der umgekehrte Weg -- mit Trennzeichen für 100er/1000er -- ist etwas aufwendiger.

      (Und ja, es gibt Sprachen, in denen man nicht 1000er, sondern 100er-Blöcke benutzt. Mir ist nur gerade entfallen, welche das sind. Portugisisch?)

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
  2. alert((new Number("300.333")).[link:http://bclary.com/2004/11/07/ecma-262.html#a-15.7.4.3@title=toLocaleString]());
    alert((new Number("300,333")).toLocaleString());

    » ...
    15.7.4.3  Number.prototype.toLocaleString()

    Produces a string value that represents the value of the Number formatted according to the conventions of the host environment's current locale. This function is implementation-dependent, and it is permissible, but not encouraged, for it to return the same thing as toString.

    NOTE
        The first parameter to this function is likely to be used in a future version of this standard; it is recommended that implementations do not use this parameter position for anything else.
    ... «

    1. Hallo,

      alert((new Number("300,333")).toLocaleString());

      Was soll das? Number("300,333") ergibt nur NaN.

      Mathias