Umwandlung von Zahlen in Text
Sumy
- php
Guten Tag
ich habe folgendes Problem, ich lese Daten via PhP aus einer MySQL Datenbank aus und die Daten die aus der einen Reihe kommen sollen umgewandelt werden,
zum Beispiel aus der Reihe Preis kommt 40 und dies soll umgewandelt werden in vierzig. Dies soll ca 130 mal passieren. von 0-130
Wie macht man sowas am besten?
Guten Tag
ich habe folgendes Problem, ich lese Daten via PhP aus einer MySQL Datenbank aus und die Daten die aus der einen Reihe kommen sollen umgewandelt werden,
zum Beispiel aus der Reihe Preis kommt 40 und dies soll umgewandelt werden in vierzig. Dies soll ca 130 mal passieren. von 0-130Wie macht man sowas am besten?
Hi,
Array erstellen:
$num2word = array('eins','zwei',....)
Dann den Wert aus der DB in Wort umwandeln.
zb. $dbergebnis = $num2word[$dbergebnis];
Gruss
Denise
Hi!
Array erstellen:
$num2word = array('eins','zwei',....)
Dann den Wert aus der DB in Wort umwandeln.
zb. $dbergebnis = $num2word[$dbergebnis];
Hierbei wurde übersehen, daß das erste Array-Element den Index 0 hat.
Was dann zur Folge hätte:
$num2word = array( 'eins', 'zwei', 'drei' );
echo $num2word[1]; // zwei
echo $num2word[2]; // drei
echo $num2word[3]; // Fehler
Schöner Gruß,
rob
Hi Rob,
Hierbei wurde übersehen, daß das erste Array-Element den Index 0 hat.
Ja ist mir zwischenzeitlich auch aufgefallen und schon angemerkt.
Allerdings ist deine Lösung weitaus weniger zu gebrauchen als meine,
das solltest du dann auch anmerken ;-)
Gruss
Denise
Hi!
Allerdings ist deine Lösung weitaus weniger zu gebrauchen als meine,
das solltest du dann auch anmerken ;-)
Stimmt da hast du wohl recht.
Nachdem ich das Ausgangsposting noch mal gelesen habe, mußte ich feststellen, daß es scheinbar ein Tabellenfeld 'Preis' gibt, wo diese Zahlen ausgelesen werden.
Irgendwie dachte ich an Texte aus der Datenbank, in denen die Zahlen durch Worte ersetzt werden sollen.
Schöner Gruß,
rob
Hi nochmal,
zb. $dbergebnis = $num2word[$dbergebnis];
Noch was, nicht vergessen, array fängt natürlich bei null in dem
Fall an. Also entweder array ab 1 zuordnen oder ergebis+1
Denise
Hi!
zum Beispiel aus der Reihe Preis kommt 40 und dies soll umgewandelt werden in vierzig. Dies soll ca 130 mal passieren. von 0-130
Wie macht man sowas am besten?
Zum Beispiel mit der Funktion str_replace().
Die Syntax ist:
mixed str_replace ( mixed $search, mixed $replace, mixed $subject [, int &$count] )
Du kannst der Funktion statt einfachen Strings zum Suchen und Ersetzen auch Arrays übergeben.
Ich würde also Arrays erstellen:
$zahlen = array( 10, 20, 30, 40 );
$worte = array( "zehn", "zwanzig", "dreizig", "vierzig" );
Das ist natürlich ein wenig arbeitsintensiv, aber das läßt sich in deinem Fall wohl nicht vermeiden.
In jedem Fall solltest du mit Stringfunktionen arbeiten und nicht auf die Idee kommen, hier reguläre Ausdrücke einzusetzen.
Schöner Gruß,
rob
Hallihallo!
Ich habe mal vor einiger Zeit eine Routine geschrieben, die mir (fast) beliebig grosse Integerzahlen in einen String umwandeln. Vielleicht ist sie für Dich ja gebrauchbar:
function IntToString($integer) {
/* Wandelt alle arabischen Zahlen von "0" bis $limit in Text um */
include('numbers.php');
$index = strlen($integer)-3;
while ($index > 0) {
$integer = substr($integer,0,$index).'.'.substr($integer,$index).'';
$index = $index-3;
}
$blocks = explode('.',$integer);
$return = ''; $block_index = count($blocks)-1; $zeroes = 0;
if ($block_index < count($names)) { // Nur, wenn die Zahl auch übersetzbar ist
foreach ($blocks as $block) {
$blockstring = '';
$hundreds = "0"; $tens = "0";
switch (strlen($block)) {
case "3" : list($hundreds, $tens, $ones)=str_split($block);
break;
case "2" : list($tens, $ones) = str_split($block);
break;
case "1" : $ones = $block;
break;
default : break;
}
if ($hundreds!='' && $hundreds!='0') {
$blockstring .= $numerals[(int)$hundreds].$parts['after_hundreds'];
}
$blockstring .= $numerals[(int)$ones];
if ($tens != '' && $tens!='0') {
$blockstring .= $parts['before_tens'].$numerals[(int)$tens].$parts['after_tens'];
}
$blockstring .= ' ';
$blockstring .= $names[$block_index];
if ($block != "1" && $block != "01" && $block != "001" && $names[$block_index] != '' && $names[$block_index] != ' Tausend') {
if (substr($blockstring,-1) != 'e') $blockstring .= 'e';
$blockstring .= 'n';
}
$blockstring = ucfirst($blockstring);
$return .= $blockstring.' ';
$block_index--;
}
foreach ($specials as $bef => $aft) {
$return = str_ireplace($bef,$aft,$return);
}
} else {
$return = $integer; // Die Zahl ist einfach zu groß
}
while ($integer/10 >= 1) { $zeroes++; $integer = $integer/10; }
$return = '<span class="number" title="Eine Zahl mit '.$zeroes.' Nullen">'.$return.'</span>';
return $return;
}
Die Datei "numbers.php" sieht so aus:
$numerals = array('null','ein','zwei','drei','vier','fünf','sechs','sieben','acht','neun');
$parts = array( 'before_tens' => 'und',
'after_tens' => 'zig',
'after_hundreds' => 'hundert'
);
$names = array( '',' Tausend',' Million',' Milliarde',' Billion',' Billiarde',' Trillion',' Trilliarde',' Quadrillion',' Quadrilliarde',' Quintillion',' Quintilliarde',' Sextillion',' Sextilliarde',' Septillion',' Septilliarde',' Oktillion',' Oktilliarde',' Nonillion',' Nonilliarde');
$specials = array( 'null ' => ' ',
'nullund' => '',
'undeinzig' => 'zehn',
'einzig' => 'zehn',
'einzehn' => 'elf',
'zweizehn' => 'zwölf',
'sechszehn' => 'sechzehn',
'siebenzehn' => 'siebzehn',
'zweizig' => 'zwanzig',
'dreizig' => 'dreißig',
'sechszig' => 'sechzig',
'siebenzig' => 'siebzig'
);
Das hat für mich den Vorteil, daß ich mir um die Größe der Zahl keine Gedanken machen muss*, und daß sich das Ganze relativ leicht in andere Sprachen übersetzen lässt.
Ein grosser Nachteil ist auf der anderen Seite natürlich, daß hier wesentlich mehr Zeit verbraucht wird, als bei einem blossen Array- Auslesevorgang.
Ich fand, der Vollständigkeit halber musste ich diese Lösung einfach erwähnen.
Vielleicht habe ich an dieser Stelle ja sogar Glück, und Irgendjemand findet Möglichkeiten, wie sich die Funktion verbessern/ veredeln lässt.
Viele liebe Grüße,
Der Dicki
* Die Zahl wird dieser Funktion als String übergeben (also "1345674312" statt 1345674312), dadurch bin ich auch nicht mehr abhängig vom Wertebereich des Integertyps.