Portal > Foren > PHP > PHP-Programmierung > Zahleneingabe in unterschiedlichen Sprachen auf PHP/MySQL-Grundform bringen
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 15.08.2007, 12:46 Nach oben    #1
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.517
Standard Zahleneingabe in unterschiedlichen Sprachen auf PHP/MySQL-Grundform bringen

Hallo,
ich schreibe es mal hier rein, anstatt in das Gesuche-Forum, weil ich nicht genau weiß, ob ich etwas Fertiges suche oder es besser selbst implementieren sollte.

Es geht um eine Internationalisierung und im Speziellen um die Darstellung bzw. die interne Speicherung von Zahlenwerten und hier selbstredend Dezimalzahlen.

Damit PHP und MySQL mit den Werten rechnen können, ist die hier dokumentierte Form intern zu verwenden.
Code:
$a = 1.234;
Der Punkt ist also nicht der Tausenderbegrenzer. Okay, soweit alles klar.

Für die Ausgabe gibt es neben den PHP-Lösungen number_format(), money_format(), sprintf() natürlich auch fertige Lösungen, z.B. bei PEAR. Mir geht es aber eher um die "Eingabe". Wenn ich über ein Formular "1,124.56" oder "1.123,89" eingebe muss ich diese Werte ja nun in die oben genannten "interne Grundform" bringen. Und hier hapert es jetzt, wie ich das am Besten mache.

Kennt da jemand eine schnelle Möglichkeit, die es ermöglicht beliebig viele Sprachen und Zahlendarstellungen zu unterstützen?


Danke.
Grüße, Ben.

PS: Gettext steht nicht zur Verfügung.
PPS: Bei Fragen zur Aufgaben- / Problemstellung einfach nachhaken.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2007, 13:29 Nach oben    #2
Dejan Spasic
 
Benutzerbild von dejan_spasic
 
Registriert seit: 05.01.2006
Ort: Düsseldorf
Beiträge: 169
Standard

Zitat:
Zitat von Ben Beitrag anzeigen
Kennt da jemand eine schnelle Möglichkeit, die es ermöglicht beliebig viele Sprachen und Zahlendarstellungen zu unterstützen?
Mach einfach zwei Eingabefelder. Ein Feld für den Vorkommabereich und das
andere für den Nachkommabereich. In diesen zwei Felder sind dann eben nur
Zahlen erlaubt. Oder spricht was dagegen.
__________________
Da wir alle in einem Boot sitzen, ist es gut, dass wir nicht alle auf einer Seite stehen... (mir unbekannt)

Geändert von dejan_spasic (15.08.2007 um 13:31 Uhr)
dejan_spasic ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2007, 13:40 Nach oben    #3
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 691
Standard

Eine andere Altenative wäre den String nach den Zeichen '.' und ',' zu durchsuchen, ist nur eines der beiden Zeichen vorhanden, ist das dein Dezimal-Trenner, sind es beide, würde ich den am weitesten rechts vorhandenen als Dezimaltrenner nutzen. Sind beide Zeichen gleichzeitig mehr als ein Mal vorhanden, ist der String fehlerhaft.

Um heraus zu finden, wie oft ein '.' und / oder ein ',' vorhanden ist, würde ich folgenden RegEx verwenden:

PHP-Code:
preg_match_all ('/(\,|\.)/'$stringDigit$arrayResult); 
Dann erhälst du ein Array, welches nur '.' und ',' enthält, das einfach durchlaufen lassen, die Anzahl zählen und schon weißt du auch, welches Zeichen am weitesten rechts steht, es ist nämlich das letzte Element im Array.
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2007, 13:56 Nach oben    #4
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.517
Standard

Hallo,
ich habe nun mal MrNiceGuy's Vorschlag verwendet, bin aber nicht ganz sicher, wie ich damit umgehen muss.

Ich habe nun folgenden Code
PHP-Code:
<?php

include 'I18Nv2.php';


$input_DE_de_1 '1.520,98';
$input_DE_de_2 '1520,98';
$input_EN_en_1 '1,345.67';
$input_EN_en_2 1345.67;


/**
 * @param float  $number|string  Eingabewert, der in das interne Zahlenformat gebracht werden soll. Kann als Dezimalzahl
 *                               oder als Zeichenkette uebergeben werden.
 * @param string $locale  Laenderangabe, in der die Eingabe verfasst wurde.
 */
function createBasicFormat($number$locale) {
    
    
$number = (string)$number;
    
    
I18Nv2::setLocale($locale);
    
$thousandsSeparator I18Nv2::getInfo('thousands_sep');
    
$decimalSeparator   I18Nv2::getInfo('decimal_point');
    
    
preg_match_all ('/(\,|\.)/'$number$arrayResult);
    
    echo 
'<pre>'var_dump($arrayResult); echo '</pre>';
    
    return 
$number;
}

echo 
$input_EN_en_1 '<br />';
echo 
createBasicFormat($input_EN_en_1'de');

echo 
'<hr />';

echo 
$input_EN_en_2 '<br />';
echo 
createBasicFormat($input_EN_en_2'de');

?>
Die Ausgabe ist
Code:
1,345.67

array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(1) ","
    [1]=>
    string(1) "."
  }
  [1]=>
  array(2) {
    [0]=>
    string(1) ","
    [1]=>
    string(1) "."
  }
}

1,345.67

-----------------------

1345,67

array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(1) ","
  }
  [1]=>
  array(1) {
    [0]=>
    string(1) ","
  }
}

1345,67
Wie genau komme ich nun hier hin
Zitat:
Dann erhälst du ein Array, welches nur '.' und ',' enthält, das einfach durchlaufen lassen, die Anzahl zählen und schon weißt du auch, welches Zeichen am weitesten rechts steht, es ist nämlich das letzte Element im Array.
Es ist ja ein mehrdimensionales Array. Meintest du das dann auch so oder habe ich irgendwas falsch verstanden? Klar, kann ich auch ein mehrdimensionales Array durchlaufen, aber das sieht mir irgendwie so umständlich aus.

Danke.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2007, 14:19 Nach oben    #5
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 691
Standard

Ach, sorry, Macht der Gewohnheit: Natürlich gibt preg_match_all () ein mehrdimensionales Array aus. Einfach nur preg_match () ist ein eindimensionales Array.

Du kannst es dann wie folgt verarbeiten:

PHP-Code:
/* [...] */
if (preg_match ('/(\,|\.)/'$stringDigit$arrayResult) > 0)
{
  
$arrayCount array_count_values ($arrayResult);

  if (
array_key_exists (','$arrayCount) === FALSE)
  {
    
$arrayCount[','] = 0;
  }
  if (
array_key_exists ('.'$arrayCount) === FALSE)
  {
    
$arrayCount['.'] = 0;
  }

  if (
$arrayCount['.'] == 1
  
OR $arrayCount[','] == 1
  
OR ($arrayCount['.'] > 1
  
AND $arrayCount[','] <= 1)
  OR (
$arrayCount['.'] <= 1
  
AND $arrayCount[','] > 1))
  {
    return 
$stringDigit;
  }
  else
  {
    return 
FALSE;
  }
}
/* [...] */ 
Das sollte eigentlich alle Möglichkeiten abdecken, aber vielleicht habe ich in der kurzen Zeit eben nicht ganz alle Möglichkeiten bei der letzten If-Abfrage bedacht!? Ich bitte dies entsprechend zu verzeihen
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2007, 14:21 Nach oben    #6
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard

Zitat:
Zitat von www.php.net/preg_match_all
In diesem Fall ist $treffer[0] der erste Satz von Übereinstimmungen und $treffer[0][0] enthält den Text, der auf das komplette Suchmuster passt, $treffer[0][1] den Text, der auf das erste Teilsuchmuster passt und so weiter. Auf die gleiche Weise ist $treffer[1] der zweite Satz von Übereinstimmungen etc.
Demzufolge musst du nicht alles durchlaufen sondern es reicht bei dir, wenn du $treffer[0] betrachtest und dann dort nach dem letzten Element suchst, dass wäre im Idealfall der Dezimaltrenner. Allerdings kann ja auch eine Ganzzahl stehen, dann musst du schauen ob das Trennzeichen an der 2. oder 3. stelle steht (halt 1.234,56 oder 1.234).

Ich würde anders vorgehen und einfach via strrev() den String umdrehen und schauen an welcher Stelle das erste Komma/der erste Punkt steht. Ist es die 3. Stelle, ists Dezimaltrenner, ists die 4. ist es Tausendertrenner.
Da brauchst du nur strpos() und keine Arraydurchforstung.
__________________
I did it my way - Senseless-Blog
Weihnachtsgeschenk? Schülern helfen - Bodypainting Kalender für 2009
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2007, 14:58 Nach oben    #7
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 553
Standard

Zitat:
Zitat von MrNiceGuy Beitrag anzeigen
Eine andere Altenative wäre den String nach den Zeichen '.' und ',' zu durchsuchen, ist nur eines der beiden Zeichen vorhanden, ist das dein Dezimal-Trenner
muss nicht: 123,456 könnte in deutscher Schreibweise 123 komma 456 sein und in englischer Schreibweise 123-tausend-456 bzw bei 123.456 umgekehrt.
Sobald beide Zeichen im String enthalten sind, ist klar, dass das letzte der Dezimaltrenner sein muss. Wenn aber nur eins drinnen steht und drei Ziffern dahinter stehen kann es beides sein. Dann geht eigentlich nur über die Browser-Locale raten...
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2007, 15:10 Nach oben    #8
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard

Ich vermute jetzt einfach mal total blind dass es sich um Währungsangaben handelt, also maximal 2 Zeichen nach dem Dezimaltrenner stehen. Aber genaues müsste Ben sagen.
__________________
I did it my way - Senseless-Blog
Weihnachtsgeschenk? Schülern helfen - Bodypainting Kalender für 2009
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2007, 15:13 Nach oben    #9
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.517
Standard

@MrNiceGuy:
Das Problem bei deinem Code ist doch irgendwie, dass dort nicht berücksichtigt wird, dass ich eine Zahl in einem anderen Format darstellen will/muss.

Das return false; muss ja durch die Umformatierung ersetzt werden und hier ist ja dann ein Problem. Ich ersetze je nach "locale" (die Informationen welche Einstellung der User, der die Eingabe macht, hat steht in seinem Profil) die Trennzeichen durch die Trennzeichen, die von PHP verwendet werden (siehe obige Links).

Ich kann nun aber nicht wild Kommas durch Punkte und andersherum ersetzen, weil ja so eventuell schon ersetzte Teile erneut verändert werden, so dass es dann zu ungültigen Formaten kommt.

Ansatz wäre also:
- Ganzzahl bestimmen
- Kommastellen bestimmen
- die beiden Teile anhand der Standardformatierung zusammen setzen
- Zahl zurückliefern


Das mit Dezimalstellen muss ich gerade nochmal nachschauen. Es sind keine Währungsangaben.


Hat jemand vielleicht noch eine Liste aller möglichen Schreibweisen? Also von Schreibweisen, die in anderen Ländern verwendet werden?

Danke schonmal für die bisherige Hilfe
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2007, 15:35 Nach oben    #10
Dejan Spasic
 
Benutzerbild von dejan_spasic
 
Registriert seit: 05.01.2006
Ort: Düsseldorf
Beiträge: 169
Standard

Zitat:
Zitat von Ben Beitrag anzeigen
Hat jemand vielleicht noch eine Liste aller möglichen Schreibweisen? Also von Schreibweisen, die in anderen Ländern verwendet werden?
http://trac.symfony-project.com/trac..._0_6/data/i18n musst halt die Werte noch druch unserialize durchjagen. In deinem Fall dürfte das Feld "NumberPatterns" und "Currencies" interessant sein.
__________________
Da wir alle in einem Boot sitzen, ist es gut, dass wir nicht alle auf einer Seite stehen... (mir unbekannt)

Geändert von dejan_spasic (15.08.2007 um 15:38 Uhr)
dejan_spasic ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2007, 15:51 Nach oben    #11
Martin Eisengardt
 
Registriert seit: 30.03.2006
Ort: Pfinztal
Beiträge: 355
Standard

Vielleicht auch hier? http://framework.zend.com/manual/en/...e.parsing.html
__________________
Open Sourcing the Online Gaming Universe
PHP/SQL/Java/C++/Assembler.
Seit Jahren Mitglied und Entwickler in einem der wohl größten Java-Projekte der Welt: http://weblogs.java.net/blog/hansmul...e_desktop.html
mepeisen ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2007, 16:17 Nach oben    #12
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.517
Standard

Mann, da hätt ich ja auch mal von selbst suchen können. Tz ..
Zitat:
Zitat von mepeisen Beitrag anzeigen
Danke. Werde mal schauen, inwiefern ich das integrieren kann.


PS:
Ah, da war ja was ... PHP4

Geändert von Ben (15.08.2007 um 16:26 Uhr)
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.08.2007, 17:04 Nach oben    #13
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.517
Standard

Ich hab das nun so:

PHP-Code:
include 'I18Nv2.php';

/**
 * @param float  $number|string  Eingabewert, der in das interne Zahlenformat gebracht werden soll. Kann als Dezimalzahl
 *                               oder als Zeichenkette uebergeben werden.
 * @param string $locale  Laenderangabe, in der die Eingabe verfasst wurde.
 */
function createBasicFormat($number$locale) {

    
// Die von PHP/MySQL intern verwendeten Trennzeichen werden definiert    
    
define('INTERNAL_THOUSANDS_SEPARATOR''');
    
define('INTERNAL_DECIMAL_SEPARATOR''.');

    
// Die Zahl wird in eine Zeichenkette konvertiert
    
$number = (string)$number;

    
// Laden der 
    
I18Nv2::setLocale($locale);
    
$thousandsSeparator I18Nv2::getInfo('thousands_sep');
    
$decimalSeparator   I18Nv2::getInfo('decimal_point');

    
// Tausendertrennzeichen entfernen
    
$number str_replace($thousandsSeparatorINTERNAL_THOUSANDS_SEPARATOR$number);
    
    
// Position des Dezimaltrennzeichens bestimmen
    
$posDecimalSeparator strpos($number$decimalSeparator);
    
    
/*
     * Wenn ein Dezimalteil in der uebergebenen Zahl existiert, so wird die Zahl aus 
     * Ganzzahl-, Dezimal-Teil und dem in PHP/MySQL verwendeten Dezimaltrennzeichen 
     * zusammengesetzt. 
     * Ansonsten existiert nur die schon bereinigte Ganzzahl und kann zurueckgegeben werden. 
     */
    
if(($posDecimalSeparator !== false) and ($posDecimalSeparator 0)) {
        
$intDigits     substr($number0$posDecimalSeparator);
        
$decimalDigits substr($number$posDecimalSeparator+1);
        
        
$number $intDigits INTERNAL_DECIMAL_SEPARATOR $decimalDigits;
        
$number = (float)$number;
    }
    else {
        
$number = (int)$number;
    }
    
    return 
$number;
}

$de_1 '1.520,98';
$de_2 '220,28';
$en_1 '1,345.67';
$en_2 1132.2;



//echo $en_1 . '<br />';
//echo createBasicFormat($en_1, 'en');
//
//echo '<hr />';
//
//echo $en_2 . '<br />';
//echo createBasicFormat($en_2, 'en');
//
//echo '<hr />';

echo $de_1 '<br />';
echo 
createBasicFormat($de_1'de');

echo 
'<hr />';

echo 
$de_2 '<br />';
echo 
createBasicFormat($de_2'de'); 
Ist das fehlerbehaftet?
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.08.2007, 08:49 Nach oben    #14
Martin Eisengardt
 
Registriert seit: 30.03.2006
Ort: Pfinztal
Beiträge: 355
Standard

Tztztz, Ben, ed gibt einen Edit-Button.
Zitat:
Zitat von Ben Beitrag anzeigen
PS:
Ah, da war ja was ... PHP4
Wechsel den Provider !!!11111eins eins eins elf elf
Die Methode sieht ansonsten hübsch aus. Aber wieso machst du deine Defines innerhalb der Methode? Dadurch definierst du die ja jedesmal neu bei mehreren Aufrufen...
__________________
Open Sourcing the Online Gaming Universe
PHP/SQL/Java/C++/Assembler.
Seit Jahren Mitglied und Entwickler in einem der wohl größten Java-Projekte der Welt: http://weblogs.java.net/blog/hansmul...e_desktop.html
mepeisen ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.08.2007, 09:30 Nach oben    #15
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.517
Standard

Guter Einwand mit den Konstanten. Die Funktion war auch nur testweise, werde das letztlich wohl in eine Klasse verpacken, so dass das dann sowieso etwas anders aussieht.

Habe allerdings noch ein paar Probleme, wenn ich anstatt der PEAR-Klasse, PHP-eigene Dinge verwenden möchte.

So führt eine Typkonvertierung ( (float), (int) ) irgendwie intern ein Umformatierung der Zahl durch, wenn ein "locale" gesetzt wurde.

PHP-Code:
    setlocale(LC_ALL$locale);
    
    
$localeConfig localeconv();
    
$thousandsSeparator $localeConfig['thousands_sep'];
    
$decimalSeparator   $localeConfig['decimal_point']; 
Das habe ich anstatt den entsprechenden Aufrufen der PEAR-Klasse bzw. ihrer Methoden.

Kann mir einer sagen, warum das so ist?


Nachtrag:
PHP-Code:
<?php

/**
 * 
 */
class I18N_Format {
    
    
/**
     * Tausendertrennzeichen, welches von PHP und MySQL intern fuer die Formatierung von vier- oder mehrstelligen 
     * Zahlen verwendet wird.
     * @var string
     */
    
var $INTERNAL_THOUSANDS_SEPARATOR '';
    
    
/**
     * Dezimaltrennzeichen, welches von PHP und MySQL intern fuer die Formatierung von Fliesskommazahlen
     * verwendet wird.
     * @var string
     */
    
var $INTERNAL_DECIMAL_SEPARATOR   '.';
    
    
    
    
/**
     * Die Methode formatiert eine beliebige uebergebene Gleitkommazahl in das PHP/MySQL-interne Format. 
     * 
     * @param float|string $number  Eingabewert, der in das interne Zahlenformat gebracht werden soll. Kann als Dezimalzahl
     *                               oder als Zeichenkette uebergeben werden.
     * @param string       $locale  Laenderangabe, in der die Eingabe verfasst wurde.
     * 
     * @return int|float
     */
    
function createBasicNumberFormat($number$locale) {
    
        
// Die Zahl wird in eine Zeichenkette konvertiert
        
$number = (string)$number;

        
// Setzen des benoetigten <em>locals</em>
        
setlocale(LC_ALL$locale);
        
        
$localeConfig localeconv();
        
$thousandsSeparator $localeConfig['thousands_sep'];
        
$decimalSeparator   $localeConfig['decimal_point'];
            
        
// Tausendertrennzeichen entfernen
        
$number str_replace($thousandsSeparator$this->INTERNAL_THOUSANDS_SEPARATOR$number);
        
        
// Position des Dezimaltrennzeichens bestimmen
        
$posDecimalSeparator strpos($number$decimalSeparator);
    
        
/*
         * Wenn ein Dezimalteil in der uebergebenen Zahl existiert, so wird die Zahl aus 
         * Ganzzahl-, Dezimal-Teil und dem in PHP/MySQL verwendeten Dezimaltrennzeichen 
         * zusammengesetzt. 
         * Ansonsten existiert nur die schon bereinigte Ganzzahl und kann zurueckgegeben werden. 
         */
        
if(($posDecimalSeparator !== false) and ($posDecimalSeparator 0)) {
            
$intDigits     substr($number0$posDecimalSeparator);
            
$decimalDigits substr($number$posDecimalSeparator+1);
            
            
$number $intDigits $this->INTERNAL_DECIMAL_SEPARATOR $decimalDigits;
//            $number = (float)$number;
        
}
        else {
            
$number = (int)$number;
        }
        
        return 
$number;
    }
    
}

$loc_de setlocale (LC_ALL'de_DE@euro''de_DE''de''ge');
echo 
"Preferred locale for german on this system is '$loc_de'<br>";

#################
#  Beispiel

$de_1 '1.520,98';
$de_2 '220,28';
$en_1 '1,345.67';
$en_2 1132.2;


$i18n = new I18N_Format();

echo 
'de_1: ' $de_1 '<br />';
echo 
$i18n->createBasicNumberFormat($de_1$loc_de);
echo 
'<hr />';

echo 
'de_2: ' $de_2 '<br />';
echo 
$i18n->createBasicNumberFormat($de_2$loc_de);
echo 
'<hr />';

//echo 'en_1: ' . $en_1 . '<br />';
//echo $i18n->createBasicNumberFormat($en_1);
//echo '<hr />';
//
//echo 'en_2: ' . $en_2 . '<br />';
//echo $i18n->createBasicNumberFormat($en_2);
//echo '<hr />';

?>
Das habe ich derzeit.

Und nun ist es echt mal "crazy" ... also, wenn ich nun eine Ausgabe mit echo von dem typkonvertierten Rückgabewert mache, dann wird ja intern aus dem float ein string, siehe hier

Zitat:
Die Umwandlung in einen String wird im dem Bereich eines Ausdrucks, in dem ein String benötigt wird, automatisch für Sie vorgenommen. Dies geschieht, wenn Sie die Funktionen echo() oder print() benutzen oder wenn Sie den Wert einer Variablen mit einem String vergleichen.
Jau. Wenn also diese interne Typenumformung gemacht wird, so wird auch aus dem Punkt als Dezimaltrenner ein Komma. Gebe ich mir den Wert mittels var_dump() aus, so erhalte ich, wie gewünscht, einen float-Wert.



Ist das nun fehlerhaft oder ist das so in Ordnung oder wie oder was. Ich weiß gerade nicht, inwiefern da Nebeneffekte auftreten können.

Danke.



Nachtrag:
Also es scheint ganz gut zu klappen. Die Rechnungen laufen und ich erhalte nach ihnen immer noch den gewünschten Typ. Nur bei der Ausgabe wird dann halt nach dem entsprechenden "local" umformatiert.

Geändert von Ben (16.08.2007 um 10:37 Uhr)
Ben ist offline