blob: 5ae563db03fdc3eda9a2858fc2b4c090565a3879 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta name="Date-Revision-yyyymmdd" content="20140918"/>
<meta http-equiv="Content-Language" content="en"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Formatting Dates and Numbers</title>
<link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/custom.css" rel="stylesheet">
<link href="/highlighter/github-theme.css" rel="stylesheet">
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="/bootstrap/js/bootstrap.js"></script>
<script type="text/javascript" src="/js/community.js"></script>
</head>
<body>
<a href="http://github.com/apache/struts" class="github-ribbon">
<img style="position: absolute; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub">
</a>
<header>
<nav>
<div role="navigation" class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" data-toggle="collapse" data-target="#struts-menu" class="navbar-toggle">
Menu
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="/index.html" class="navbar-brand logo"><img src="/img/struts-logo.svg"></a>
</div>
<div id="struts-menu" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Home<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/index.html">Welcome</a></li>
<li><a href="/download.cgi">Download</a></li>
<li><a href="/releases.html">Releases</a></li>
<li><a href="/announce.html">Announcements</a></li>
<li><a href="http://www.apache.org/licenses/">License</a></li>
<li><a href="https://www.apache.org/foundation/thanks.html">Thanks!</a></li>
<li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Support<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/mail.html">User Mailing List</a></li>
<li><a href="https://issues.apache.org/jira/browse/WW">Issue Tracker</a></li>
<li><a href="/security.html">Reporting Security Issues</a></li>
<li class="divider"></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Migration+Guide">Version Notes</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Security+Bulletins">Security Bulletins</a></li>
<li class="divider"></li>
<li><a href="/maven/project-info.html">Maven Project Info</a></li>
<li><a href="/maven/struts2-core/dependencies.html">Struts Core Dependencies</a></li>
<li><a href="/maven/struts2-plugins/modules.html">Plugin Dependencies</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Documentation<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/birdseye.html">Birds Eye</a></li>
<li><a href="/primer.html">Key Technologies</a></li>
<li><a href="/kickstart.html">Kickstart FAQ</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Home">Wiki</a></li>
<li class="divider"></li>
<li><a href="/getting-started/">Getting Started</a></li>
<li><a href="/security/">Security Guide</a></li>
<li><a href="/core-developers/">Core Developers Guide</a></li>
<li><a href="/tag-developers/">Tag Developers Guide</a></li>
<li><a href="/maven-archetypes/">Maven Archetypes</a></li>
<li><a href="/plugins/">Plugins</a></li>
<li><a href="/maven/struts2-core/apidocs/index.html">Struts Core API</a></li>
<li><a href="/tag-developers/tag-reference.html">Tag reference</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/FAQs">FAQs</a></li>
<li><a href="http://cwiki.apache.org/S2PLUGINS/home.html">Plugin registry</a></li>
</ul>
</li>
<li class="dropdown">
<a data-toggle="dropdown" href="#" class="dropdown-toggle">
Contributing<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/youatstruts.html">You at Struts</a></li>
<li><a href="/helping.html">How to Help FAQ</a></li>
<li><a href="/dev-mail.html">Development Lists</a></li>
<li><a href="/contributors/">Contributors Guide</a></li>
<li class="divider"></li>
<li><a href="/submitting-patches.html">Submitting patches</a></li>
<li><a href="/builds.html">Source Code and Builds</a></li>
<li><a href="/coding-standards.html">Coding standards</a></li>
<li><a href="https://cwiki.apache.org/confluence/display/WW/Contributors+Guide">Contributors Guide</a></li>
<li class="divider"></li>
<li><a href="/release-guidelines.html">Release Guidelines</a></li>
<li><a href="/bylaws.html">PMC Charter</a></li>
<li><a href="/volunteers.html">Volunteers</a></li>
<li><a href="https://gitbox.apache.org/repos/asf?p=struts.git">Source Repository</a></li>
<li><a href="/updating-website.html">Updating the website</a></li>
</ul>
</li>
<li class="apache"><a href="http://www.apache.org/"><img src="/img/apache.png"></a></li>
</ul>
</div>
</div>
</div>
</nav>
</header>
<article class="container">
<section class="col-md-12">
<a href="index.html" title="back to Core Developers Guide"><< back to Core Developers Guide</a>
<a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/core-developers/formatting-dates-and-numbers.md" title="Edit this page on GitHub">Edit on GitHub</a>
<h1 id="formatting-dates-and-numbers">Formatting Dates and Numbers</h1>
<h2 id="defining-formats">Defining Formats</h2>
<p>Struts2 supports localization (l10n) aware formatting of dates, times and numbers very easily, utilizing Java’s
built-in date formatting features.</p>
<p>As seen in the <a href="localization.html">Localization</a> chapter, it is quite easy to define hierarchical resource bundles
with Struts2, giving the developer the opportunity to define locale dependent message formats. This is the entry point
to define the needed date, time and number formats. Your default properties could contain the following generic formats:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>format.time = {0,time}
format.number = {0,number,#0.0##}
format.percent = {0,number,##0.00'%'}
format.money = {0,number,\u00A4##0.00}
</code></pre></div></div>
<p>An appropriate en_US format definition extension could look like this:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>format.date = {0,date,MM/dd/yy}
</code></pre></div></div>
<p>In parallel, you could add the following to your de_DE bundle:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>format.date = {0,date,dd.MM.yyyy}
</code></pre></div></div>
<p>Read more on how to define message formats in Sun’s Java API docs for <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat.html">MessageFormat</a>.</p>
<p>Now that we have our formats set up, it is quite easy to use them in our views.</p>
<h2 id="formatting-output-using-the-stext-tag">Formatting output using the s:text tag</h2>
<p>Given you had a Float value myMoneyValue, accessible through the getter getMyMoneyValue in your action, the following
code would print out localized representation of the value as a currency amount, using the format.money message
format defined above with a <code class="highlighter-rouge">s:text</code> tag:</p>
<pre><code class="language-jsp">&lt;s:text name="format.money"&gt;
&lt;s:param name="value" value="myMoneyValue"/&gt;
&lt;/s:text&gt;
</code></pre>
<p>The (first) parameter defines the value which is to replace the ‘0’ placeholder in the defined message format.</p>
<p>Another example, formatting a date value:</p>
<pre><code class="language-jsp">&lt;s:text name="format.date"&gt;&lt;s:param value="dueDate"/&gt;&lt;/s:text&gt;
</code></pre>
<blockquote>
<p>While the <code class="highlighter-rouge">s:text</code> tag is very useful to format numbers, date formatting has become a lot easier thanks
to the <code class="highlighter-rouge">s:date</code> tag.</p>
</blockquote>
<h2 id="localizing-form-data-with-gettext">Localizing form data with getText</h2>
<p>Placing a textfield in a form like this</p>
<pre><code class="language-jsp">&lt;s:textfield key="orderItem.price" /&gt;
</code></pre>
<p>to input a number, one might have noticed that the number is always shown in the Java default number format. Not only
that this is not “nice”, if you are in a non-en locale, it will also cause trouble when submitting the form since type
conversion is locale aware. The solution is to again use the message formats as defined above, by using the getText
method of ActionSupport:</p>
<pre><code class="language-jsp">&lt;s:textfield key="orderItem.price" value="%{getText('format.number',{orderItem.price})}" /&gt;
</code></pre>
<p>This maps to the method signature <code class="highlighter-rouge">getText( String key, Object[] params )</code> in ActionSupport.</p>
<h2 id="using-getformatted-with-conversion-support">Using getFormatted() with conversion support</h2>
<p>A new method getFormatted was added to ActionSupport (which can be implemented in your base action) to support
formatting and conversion errors with I10N.</p>
<p>You can place a code like below</p>
<pre><code class="language-jsp">&lt;s:textfield key="user.born" value="%{getFormatted('format.number','user.born')}" /&gt;
</code></pre>
<p>to get support for I10N and also to support conversion errors.</p>
</section>
</article>
<footer class="container">
<div class="col-md-12">
Copyright &copy; 2000-2018 <a href="http://www.apache.org/">The Apache Software Foundation </a>.
All Rights Reserved.
</div>
<div class="col-md-12">
Apache Struts, Struts, Apache, the Apache feather logo, and the Apache Struts project logos are
trademarks of The Apache Software Foundation.
</div>
<div class="col-md-12">Logo and website design donated by <a href="https://softwaremill.com/">SoftwareMill</a>.</div>
</footer>
<script>!function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (!d.getElementById(id)) {
js = d.createElement(s);
js.id = id;
js.src = "//platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
}
}(document, "script", "twitter-wjs");</script>
<script src="https://apis.google.com/js/platform.js" async="async" defer="defer"></script>
<div id="fb-root"></div>
<script>(function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
</body>
</html>