
it.tidalwave.metadata.text.EVFormat Maven / Gradle / Ivy
The newest version!
/***********************************************************************************************************************
*
* blueMarine Metadata - open source media workflow
* Copyright (C) 2007-2011 by Tidalwave s.a.s. (http://www.tidalwave.it)
*
***********************************************************************************************************************
*
* Licensed 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.
*
***********************************************************************************************************************
*
* WWW: http://bluemarine.tidalwave.it
* SCM: https://kenai.com/hg/bluemarine~metadata-src
*
**********************************************************************************************************************/
package it.tidalwave.metadata.text;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
import java.util.StringTokenizer;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import java.text.ParseException;
/*******************************************************************************
*
* @author Fabrizio Giudici
* @version $Id$
*
******************************************************************************/
public class EVFormat extends DecimalFormat
{
public static enum Fractions
{
STANDARD("1/6", "1/3", "1/2", "2/3", "5/6"),
UNICODE("\u2159", "\u2153", "\u00bd", "\u2154", "\u215A");
@Nonnull
private final String[] strings;
private Fractions (@Nonnull final String ... strings)
{
this.strings = strings;
}
@Nonnull
public String getString (@Nonnegative final int i)
{
return strings[i];
}
}
private static final long serialVersionUID = 7069052345876458L;
private static final int[] NUMERATORS = { 1, 1, 1, 2, 5 };
private static final int[] DENUMERATORS = { 6, 3, 2, 3, 6 };
private Fractions fractions;
public EVFormat()
{
this( Fractions.STANDARD);
}
public EVFormat (@Nonnull final Fractions fractions)
{
this.fractions = fractions;
}
@Nonnull
public Fractions getFractions()
{
return fractions;
}
public void setFractions (@Nonnull final Fractions fractions)
{
this.fractions = fractions;
}
@Override
@Nonnull
public StringBuffer format (@Nonnegative final long number,
@Nonnull final StringBuffer result,
@Nonnull final FieldPosition fieldPosition)
{
return format((double)number, result, fieldPosition);
}
@Override
@Nonnull
public StringBuffer format (@Nonnegative final double number,
@Nonnull final StringBuffer toAppendTo,
@Nonnull final FieldPosition fieldPosition)
{
final StringBuilder s = new StringBuilder();
if (number == 0)
{
s.append("0");
}
else
{
if (number > 0)
{
s.append("+");
}
if (number < 0)
{
s.append("-");
}
final double abs = Math.abs(number);
final int integer = (int)Math.floor(abs);
final double fractional = abs - integer;
if (integer != 0)
{
s.append(integer);
s.append(" ");
}
s.append(getFractionText(fractional));
}
toAppendTo.append(s.toString().trim());
toAppendTo.append(" EV");
return toAppendTo;
}
@Override
@Nonnull
public Number parse (@CheckForNull String s)
throws ParseException
{
if (s != null)
{
s = s.replaceAll("EV$", "").trim();
}
if ((s == null) || s.equals("") || s.equals("0"))
{
return Double.valueOf(0); // FIXME
}
StringTokenizer st = new StringTokenizer(s.substring(1), " ");
final String maybeIntegerPart = st.nextToken().trim();
double d = 0;
String fractionalPart = null;
if (!maybeIntegerPart.contains("/"))
{
d = Double.parseDouble(maybeIntegerPart);
if (st.hasMoreTokens())
{
fractionalPart = st.nextToken();
}
}
else
{
fractionalPart = maybeIntegerPart;
}
if (fractionalPart != null)
{
st = new StringTokenizer(fractionalPart, "/");
d += (Double.parseDouble(st.nextToken()) / Double.parseDouble(st.nextToken()));
}
if (s.charAt(0) == '-')
{
d = -d;
}
return Double.valueOf(d);
}
@Nonnull
private String getFractionText (@Nonnegative final double value)
{
for (int i = 0; i < NUMERATORS.length; i++)
{
if (Math.abs((value * DENUMERATORS[i]) - NUMERATORS[i]) < 0.01)
{
return fractions.getString(i);
}
}
return "";
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy