blob: cd667b0c6bb55efb0dd40b99f5997d9328363677 [file] [log] [blame]
using System;
using System.Text;
namespace Lucene.Net.Util
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/// <summary>
/// Extension methods to spell out numbers into English.
/// <para/>
/// Inspiration: https://stackoverflow.com/a/2601001
/// </summary>
public static class EnglishNumberFormatExtensions
{
private const long QUADRILLION = TRILLION * 1000;
private const long TRILLION = BILLION * 1000;
private const long BILLION = MILLION * 1000;
private const long MILLION = THOUSAND * 1000;
private const long THOUSAND = HUNDRED * 10;
private const long HUNDRED = 100;
/// <summary>
/// Returns the spelled-out English words for the provided <paramref name="value"/>.
/// </summary>
public static string ToWords(this int value)
{
return ToWords((long)value);
}
/// <summary>
/// Returns the spelled-out English words for the provided <paramref name="value"/>.
/// </summary>
public static string ToWords(this long value)
{
return ToWords(value, new StringBuilder()).ToString();
}
private static StringBuilder ToWords(long value, StringBuilder builder)
{
if (value == 0) builder.Append("zero");
if (value < 0)
{
builder.Append("negative ");
ToWords(Math.Abs(value), builder);
}
long unit;
if (value >= QUADRILLION)
{
unit = (value / QUADRILLION);
value -= unit * QUADRILLION;
ToWords(unit, builder);
builder.Append(" quadrillion");
if (value > 0) builder.Append(" ");
}
if (value >= TRILLION)
{
unit = (value / TRILLION);
value -= unit * TRILLION;
ToWords(unit, builder);
builder.Append(" trillion");
if (value > 0) builder.Append(" ");
}
if (value >= BILLION)
{
unit = (value / BILLION);
value -= unit * BILLION;
ToWords(unit, builder);
builder.Append(" billion");
if (value > 0) builder.Append(" ");
}
if (value >= MILLION)
{
unit = (value / MILLION);
value -= unit * MILLION;
ToWords(unit, builder);
builder.Append(" million");
if (value > 0) builder.Append(" ");
}
if (value >= THOUSAND)
{
unit = (value / THOUSAND);
value -= unit * THOUSAND;
ToWords(unit, builder);
builder.Append(" thousand");
if (value > 0) builder.Append(" ");
}
if (value >= HUNDRED)
{
unit = (value / HUNDRED);
value -= unit * HUNDRED;
ToWords(unit, builder);
builder.Append(" hundred");
if (value > 0) builder.Append(" ");
}
if (value >= 90)
{
value -= 90;
builder.Append("ninety");
if (value > 0) builder.Append("-");
}
if (value >= 80)
{
value -= 80;
builder.Append("eighty");
if (value > 0) builder.Append("-");
}
if (value >= 70)
{
value -= 70;
builder.Append("seventy");
if (value > 0) builder.Append("-");
}
if (value >= 60)
{
value -= 60;
builder.Append("sixty");
if (value > 0) builder.Append("-");
}
if (value >= 50)
{
value -= 50;
builder.Append("fifty");
if (value > 0) builder.Append("-");
}
if (value >= 40)
{
value -= 40;
builder.Append("forty");
if (value > 0) builder.Append("-");
}
if (value >= 30)
{
value -= 30;
builder.Append("thirty");
if (value > 0) builder.Append("-");
}
if (value >= 20)
{
value -= 20;
builder.Append("twenty");
if (value > 0) builder.Append("-");
}
if (value == 19) builder.Append("nineteen");
if (value == 18) builder.Append("eighteen");
if (value == 17) builder.Append("seventeen");
if (value == 16) builder.Append("sixteen");
if (value == 15) builder.Append("fifteen");
if (value == 14) builder.Append("fourteen");
if (value == 13) builder.Append("thirteen");
if (value == 12) builder.Append("twelve");
if (value == 11) builder.Append("eleven");
if (value == 10) builder.Append("ten");
if (value == 9) builder.Append("nine");
if (value == 8) builder.Append("eight");
if (value == 7) builder.Append("seven");
if (value == 6) builder.Append("six");
if (value == 5) builder.Append("five");
if (value == 4) builder.Append("four");
if (value == 3) builder.Append("three");
if (value == 2) builder.Append("two");
if (value == 1) builder.Append("one");
return builder;
}
}
}