/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package net.sf.saxon.number; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; /** * Numberer class for the Norwegian language */ public final class Numberer_no extends AbstractNumberer { private static final long serialVersionUID = 1L; private static String[] norwegianOrdinalUnits = {"", "f%C3%B8rste", "andre", "tredje", "fjerde", "femte", "sjette", "sjuende", "%C3%A5ttende", "niende", "tiende", "ellevte", "tolvte", "trettende", "fjortende", "femtende", "sekstende", "syttende", "attende", "nittende"}; private static String[] norwegianOrdinalTens = {"", "tiende", "tjuende", "trettiende", "f%C3%B8rtiende", "femtiende", "sekstiende", "syttiende", "%C3%A5ttiende", "nittiende"}; private static String[] norwegianUnits = {"", "en", "to", "tre", "fire", "fem", "seks", "sju", "%C3%A5tte", "ni", "ti", "elleve", "tolv", "tretten", "fjorten", "seksten", "seksten", "s%C3%B8tten", "atten", "nitten"}; private static String[] norwegianTens = {"", "ti", "tjue", "tretti", "f%C3%B8rti", "femti", "seksti", "sytti", "%C3%A5tti", "nitti"}; private static String[] norwegianMonths = {"januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"}; private static String[] norwegianDays = {"mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l%C3%B8rdag", "s%C3%B8ndag"}; private static String[] norwegianDayAbbreviations = {"man", "tir", "ons", "tor", "fre", "l%C3%B8r", "s%C3%B8n"}; private static int[] minUniqueDayLength = {1, 2, 1, 2, 1, 1, 1}; public String toOrdinalWords( String ordinalParam, long number, int wordCase ) { String s; if ( number >= 1000000000 ) { long rem = number % 1000000000; s = ( number / 1000000000 == 1 ? "en" : toWords( number / 1000000000 ) ) + " milliard" + ( number / 1000000000 == 1 || rem == 0 ? "" : "er" ) + ( rem == 0 ? "te" : ( rem < 100 ? " og " : " " ) + toOrdinalWords( ordinalParam, rem, wordCase ) ); } else if ( number >= 1000000 ) { long rem = number % 1000000; s = ( number / 1000000 == 1 ? "en" : toWords( number / 1000000 ) ) + " million" + ( number / 1000000 == 1 || rem == 0 ? "" : "er" ) + ( rem == 0 ? "te" : ( rem < 100 ? " og " : " " ) + toOrdinalWords( ordinalParam, rem, wordCase ) ); } else if ( number >= 1000 ) { long rem = number % 1000; s = ( number / 1000 == 1 ? "et" : toWords( number / 1000 ) ) + " tusen" + ( rem == 0 ? "de" : ( rem < 100 ? " og " : " " ) + toOrdinalWords( ordinalParam, rem, wordCase ) ); } else if ( number >= 100 ) { long rem = number % 100; s = ( number / 100 == 1 ? "et" : toWords( number / 100 ) ) + " hundre" + ( rem == 0 ? "de" : " og " + toOrdinalWords( ordinalParam, rem, wordCase ) ); } else { if ( number < 20 ) { s = decode( norwegianOrdinalUnits[(int) number] ); } else { int rem = (int) ( number % 10 ); if ( rem == 0 ) { s = decode( norwegianOrdinalTens[(int) number / 10] ); } else { s = decode( norwegianTens[(int) number / 10] ) + decode( norwegianOrdinalUnits[rem] ); } } } if ( wordCase == UPPER_CASE ) { return s.toUpperCase(); } else if ( wordCase == LOWER_CASE ) { return s.toLowerCase(); } else { return s; } } public String toWords( long number ) { if ( number >= 1000000000 ) { long rem = number % 1000000000; return ( number / 1000000000 == 1 ? "en" : toWords( number / 1000000000 ) ) + " milliard" + ( number / 1000000000 == 1 ? "" : "er" ) + ( rem == 0 ? "" : ( rem < 100 ? " og " : " " ) + toWords( rem ) ); } else if ( number >= 1000000 ) { long rem = number % 1000000; return ( number / 1000000 == 1 ? "en" : toWords( number / 1000000 ) ) + " million" + ( number / 1000000 == 1 ? "" : "er" ) + ( rem == 0 ? "" : ( rem < 100 ? " og " : " " ) + toWords( rem ) ); } else if ( number >= 1000 ) { long rem = number % 1000; return ( number / 1000 == 1 ? "et" : toWords( number / 1000 ) ) + " tusen" + ( rem == 0 ? "" : ( rem < 100 ? " og " : " " ) + toWords( rem ) ); } else if ( number >= 100 ) { long rem = number % 100; return ( number / 100 == 1 ? "et" : toWords( number / 100 ) ) + " hundre" + ( rem == 0 ? "" : " og " + toWords( rem ) ); } else { if ( number < 20 ) { return decode( norwegianUnits[(int) number] ); } int rem = (int) ( number % 10 ); return decode( norwegianTens[(int) number / 10] ) + decode( norwegianUnits[rem] ); } } public String toWords( long number, int wordCase ) { String s; if ( number == 0 ) { s = "null"; } else { s = toWords( number ); } if ( wordCase == UPPER_CASE ) { return s.toUpperCase(); } else if ( wordCase == LOWER_CASE ) { return s.toLowerCase(); } else { return s; } } public String monthName( int month, int minWidth, int maxWidth ) { String name = decode( norwegianMonths[month - 1] ); if ( maxWidth < 3 ) { maxWidth = 3; } if ( name.length() > maxWidth ) { name = name.substring( 0, maxWidth ); } while ( name.length() < minWidth ) { name = name + ' '; } return name; } public String dayName( int day, int minWidth, int maxWidth ) { String name = decode( norwegianDays[day - 1] ); if ( maxWidth < 2 ) { maxWidth = 2; } if ( name.length() > maxWidth ) { name = decode( norwegianDayAbbreviations[day - 1] ); if ( name.length() > maxWidth ) { name = name.substring( 0, maxWidth ); } } while ( name.length() < minWidth ) { name = name + ' '; } if ( minWidth == 1 && maxWidth == 2 ) { // special case name = name.substring( 0, minUniqueDayLength[day - 1] ); } return name; } private String decode( String s ) { try { return URLDecoder.decode( s, "UTF-8" ); } catch ( UnsupportedEncodingException e ) { throw new RuntimeException( e ); } } }