<#--
  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.
-->
<html>
<head>
<title>FreeMarker: Number Literal Test</title>
</head>
<body>
<#assign hash = {"1" : "one", 
                 "12" : "twelve", 
                "2one" : "two-one", 
                "one2" : "one-two"}
         list = ["zero", 
                 "one", 
                 "two", 
                 "three", 
                 "four", 
                 "five", 
                 "six", 
                 "seven", 
                 "eight", 
                 "nine", 
                 "ten",
                 "eleven",
                 "twelve"],
          foo = "bar",
          one = "one",
          "1" = "one",
          "12" = "twelve",
          "2one" = "two-one",
          "one2" = "one-two",
          call = "freemarker.test.templatesuite.models.SimpleTestMethod"?new()
>

<p>A simple test follows:</p>

<p>${message}</p>

<p>Now perform a number assignment:</p>

#{1.300000?double}

<#assign mynumber = 1.8, USA="en_US" />
<#assign myfloat = mynumber?float />

My number is: ${mynumber}
<#setting locale="en_US">
My float is: #{myfloat ; m6}
The int part is: ${myfloat?int}

<#assign mymessage = mynumber?string>

${mymessage + 3}

<p>Now use numbers in assignment</p>

<#assign mymessage = 1 + 5>
${mymessage}

<#assign mymessage = mymessage + 2>
#{mymessage}

<p>Try numbers in tests</p>

<#if (mymessage == 152)>
MyMessage is 152
<#else>
MyMessage is not 152, its: ${mymessage}.
</#if >

<if (mymessage > 5)>
   MyMessage is greater than five.
</if

<#switch mymessage>
	<#case 1>
		MyMessage is one
		<#break>

	<#case 15>
		MyMessage is fifteen
		<#break>
	
	<#case 152>
		MyMessage is one-five-two
		<#break>
	
	<#default>
		MyMessage is: ${mymessage}.
		<#break>
	
</#switch>

<p>Now for numbers in dynamic keys:</p>

<#assign one = 1>
<#assign two = 2>

${list[ 1 ]}
${list[ 1 + 2 ]}

<p>Numbers in hashes:</p>

${hash[ 1 + "2" ]}
${hash[ "1" + 2 ]}
${hash[ "1" + two ]}


<p>Numbers in method calls:</p>

${call( 1 )}
${call( one )}
${call( one + "2" )}
${call( one + 2 )}
${call( 1 + 2 )}

</body>
</html>
