Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 12 additions & 117 deletions src/WordToNumber.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ class WordToNumber {
"eighty" => '80',
"ninety" => '90'
],
"hundred" => "hundred",
"large" => [
"hundred" => 3,
"thousand" => 4,
Expand All @@ -75,17 +74,17 @@ class WordToNumber {
"quadrillion" => 16,
"quintillion" => 19,
"sextillion" => 22,
"septillion" => 25,
"septillion" => 23,
"octillion" => 28,
"nonillion" => 31,
"decillion" => 34,
"undecillion" => 37,
"duodecillion" => 40,
"tredecillion" => 43,
"tredecillion" => 41,
"quattuordecillion" => 46,
"quindecillion" => 49,
"sexdecillion" => 52,
"septendecillion" => 55,
"septendecillion" => 53,
"octodecillion" => 58,
"novemdecillion" => 61,
"vigintillion" => 64,
Expand All @@ -104,7 +103,7 @@ class WordToNumber {
"googol" => 101,
"trestrigintillion" => 103,
"quattuortrigintillion" => 106,
"quinquatrigintillion" => 109,
"quinquatrigintillion" => 110,
"sestrigintillion" => 112,
"septentrigintillion" => 115,
"octotrigintillion" => 118,
Expand Down Expand Up @@ -140,100 +139,7 @@ class WordToNumber {
"nongentillion" => 2704,
"millinillion" => 3004
]
],

"french" => [
"single" => [
"zero" => '0',
"zéro" => '0',
"un" => '1',
"deux" => '2',
"trois" => '3',
"quatre" => '4',
"cinq" => '5',
"six" => '6',
"sept" => '7',
"huit" => '8',
"neuf" => '9'
],
"tens" => [
"dix" => '10',
"onze" => '11',
"douze" => '12',
"treize" => '13',
"quatorze" => '14',
"quinze" => '15',
"seize" => '16',
"dix-sept" => '17',
"dix-huit" => '18',
"dix-neuf" => '19',
"vingt" => '20',
"trente" => '30',
"quarante" => '40',
"cinquante" => '50',
"soixante" => '60',
"soixante-dix" => '70',
"soixante dix" => '70',
"quatre-vingt" => '80',
"quatre vingt" => '80',
"quatre-vingts" => '80',
"quatre vingts" => '80',
"quatre-vingt-dix" => '90',
"quatre-vingt dix" => '90',
"quatre vingt-dix" => '90',
"quatre vingt dix" => '90',
"quatre-vingts-dix" => '90',
"quatre-vingts dix" => '90',
"quatre vingts-dix" => '90',
"quatre vingts dix" => '90',
],
"hundred" => "cent",
"large" => [
"cent" => 3,
"mille" => 4,
"milles" => 4,
"million" => 7,
"millions" => 7,
"milliard" => 10,
"milliards" => 10,
"billion" => 13,
"billions" => 13,
"billard" => 16,
"billards" => 16,
"trillion" => 19,
"trillions" => 19,
"trillard" => 22,
"trillards" => 22,
"quadrillion" => 25,
"quadrillions" => 25,
"quadrillard" => 28,
"quadrillards" => 28,
"quintillion" => 31,
"quintillions" => 31,
"quintillard" => 34,
"quintillards" => 34,
"sextillion" => 37,
"sextillions" => 37,
"sextilliard" => 40,
"sextilliards" => 40,
"septillion" => 43,
"septillions" => 43,
"septilliard" => 46,
"septilliards" => 46,
"octillion" => 49,
"octillions" => 49,
"octilliard" => 52,
"octilliards" => 52,
"nonillion" => 55,
"nonillions" => 55,
"nonilliard" => 58,
"nonilliards" => 58,
"decillion" => 61,
"decillions" => 61,
"decilliard" => 64,
"decilliards" => 64,
]
]
]
];

/*
Expand Down Expand Up @@ -379,12 +285,10 @@ private function parsePreNumber( $text, $do_check = TRUE ) {
$pre_number = FALSE;
$post_number = $text;

$hundred = $this->languages[ $this->language ]["hundred"];

if ( $do_check ) {
$check = FALSE;
$check_array = array_merge(
[$hundred => 1],
["hundred" => 1],
$this->languages[ $this->language ]["single"],
$this->languages[ $this->language ]["tens"]
);
Expand All @@ -398,14 +302,11 @@ private function parsePreNumber( $text, $do_check = TRUE ) {
return FALSE;
}

if ( strpos( $text, $hundred ) !== FALSE ) {
if ( strpos( $text, "hundred" ) !== FALSE ) {

$matches = $this->trimArray( explode( $hundred, $text ) );
if ( strlen( $matches[0] ) ) {
$matches = $this->trimArray( explode( "hundred", $text ) );
if ( strlen( $matches[0] ) )
$pre_number = $this->parseSingle( $matches[0] );
} else {
$pre_number = 1;
}

$number = $this->createNumber( $pre_number, 3 );
$post_number = $this->trimSeparators( $matches[1] );
Expand Down Expand Up @@ -460,17 +361,14 @@ private function parseSingle( $text ) {
private function parseTens( $text ) {

$number = FALSE;
foreach ( array_reverse($this->languages[ $this->language ]["tens"]) as $word => $val ) {
foreach ( $this->languages[ $this->language ]["tens"] as $word => $val ) {

$match = explode( $word, $text );

if ( $match && isset( $match[1] ) ) {
$number = $val;
$single = ( ! empty( $match[1] ) ) ? $this->parseSingle( $match[1] ) : FALSE ;
if ( FALSE === $single ) {
$single = ( ! empty( $match[1] ) ) ? $this->parseTens( $match[1] ) : FALSE ;
}
return ( $single ) ? (string)(intval($number)+intval($single)) : $number ;
return ( $single ) ? substr( $number, 0, 1 ) . $single : $number ;
}

}
Expand All @@ -493,7 +391,7 @@ public function parse( $text ){

$text = strtolower( $text );

// loop through all our "large numbers" longest to shortest
// loop thorugh all our "large numbers" longest to shortest
$number = FALSE;
foreach ( array_reverse( $this->languages[ $this->language ]["large"] ) as $word => $val ) {

Expand All @@ -507,9 +405,6 @@ public function parse( $text ){

$pre_number_parsed = ( $this->parsePreNumber( $this->trimSeparators( $pre_number ), ( $number !== FALSE ) ) ) ?: '' ;

if ( empty($pre_number_parsed) )
$pre_number_parsed = 1;

if ( $number == FALSE )
$number = $this->createNumber( $pre_number_parsed, $val );
else
Expand Down
94 changes: 28 additions & 66 deletions tests/src/WordToNumberTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,72 +3,34 @@
use daraeman\WordToNumber;

class WordToNumberTest extends \PHPUnit_Framework_TestCase {

public function testParseNumberNormal() {

public function testParseNumberNormal() {

$wordToNumber = new WordToNumber();

$checks = [
"one" => "1",
"seventy three" => "73",
"one hundred" => "100",
"one hundred seven" => "107",
"one hundred seventy" => "170",
"one hundred seventy three" => "173",
"one hundred seventy-three" => "173",
"one hundred and seventy-three" => "173",
"one hundred and seventy-three thousand" => "173000",
"two hundred, seventy-three thousand" => "273000",
"one hundred and seventy-three million" => "173000000",
"one hundred and seventy-three million two thousand" => "173002000",
"one hundred,,,,,and,,,,,seventy-three million two thousand and two" => "173002002",
"one hundred and - --seventy-three billion" => "173000000000",
"one hundred.- .,and seventy-three trillion five million sixty seven thousand one hundred and eighty two" => "173000005067182",
"just some extra text here one hundred and seventy-three some more text at the end" => "173",
];

foreach ( $checks as $check => $expected ) {
$result = $wordToNumber->parse( $check );
if ( $expected !== $result ) {
$this->fail( "'$check' yielded '$result' instead of expected '$expected'." );
}
}
}

public function testParseNumberInFrench() {

$wordToNumber = new WordToNumber();
$wordToNumber->setLanguage( 'french' );

$checks = [
"zéro" => "0",
"zero" => "0",
"un" => "1",
"quarante-deux" => "42",
"soixante-treize" => "73",
"soixante treize" => "73",
"quatre-vingts" => "80",
"quatre vingt treize" => "93",
"cent" => "100",
"six cent" => "600",
"cent sept" => "107",
"cent soixante-dix" => "170",
"cent soixante treize" => "173",
"deux cent soixante treize mille" => "273000",
"cent soixante treize mille" => "173000",
"cent soixante treize million" => "173000000",
"cent soixante treize millions" => "173000000",
"cent soixante seize million deux mille" => "176002000",
"neuf cent vingt-deux millions deux mille trois cent dix-huit" => "922002318",
];

foreach ( $checks as $check => $expected ) {
$result = $wordToNumber->parse( $check );
if ( $expected !== $result ) {
$this->fail( "'$check' yielded '$result' instead of expected '$expected'." );
}
}
}
$wordToNumber = new WordToNumber();

$checks = [
"one" => "1",
"seventy three" => "73",
"one hundred" => "100",
"one hundred seven" => "107",
"one hundred seventy" => "170",
"one hundred seventy three" => "173",
"one hundred seventy-three" => "173",
"one hundred and seventy-three" => "173",
"one hundred and seventy-three thousand" => "173000",
"one hundred and seventy-three million" => "173000000",
"one hundred and seventy-three million two thousand" => "173002000",
"one hundred,,,,,and,,,,,seventy-three million two thousand and two" => "173002002",
"one hundred and - --seventy-three billion" => "173000000000",
"one hundred.- .,and seventy-three trillion five million sixty seven thousand one hundred and eighty two" => "173000005067182",
"just some extra text here one hundred and seventy-three some more text at the end" => "173",
];

foreach ( $checks as $check => $expected ) {
$result = $wordToNumber->parse( $check );
$this->assertEquals( $expected, $result );
}
}

public function testParseNumberOddlyFormatted() {

Expand All @@ -83,7 +45,7 @@ public function testListLanguages() {
$wordToNumber = new WordToNumber();
$result = $wordToNumber->listLanguages();

$this->assertEquals( [ "english", 'french' ], $result );
$this->assertEquals( [ "english" ], $result );
}

public function testSetLanguageExists() {
Expand Down