SlideShare una empresa de Scribd logo
1 de 26
JSR 354
Moneda y Dinero
CLOJUG
24-ENE-2015
http://www.clojug.org Imagen tomada de http://elpueblo.com.co/
JSR 354
Moneda y Dinero
Anatole Tresch
@atsticks
Regular Conference Speaker
Specification Lead JSR 354
Proyecto en Java.net
http://java.net/projects/javamoney
JSR
https://jcp.org/en/jsr/detail?id=354
Proyecto en Github
http://javamoney.github.io/
Twitter
@jsr354
JSR 354
Moneda y Dinero
Los valores monetarios son parte fundamental de muchas aplicaciones, sin
embargo, el JDK provee poco o ningún soporte para éstos.
La clase existente java.util.Currency es solamente una estructura para la
representación de las monedas actuales (ISO-4217), pero no para
representar sus valores asociados o monedas personalizadas. El JDK
tampoco ofrece soporte para operaciones aritméticas con monedas o
conversión entre ellas ni tampoco un tipo de valor estándar para representar
un valor monetario.
“
Texto tomado de la especificación del JSR-354
Agenda
Introducción
Tasas de Cambio y Conversión
Monedas y Valores Monetarios
Formato y Análisis
Extensiones
44
55
Documentación y Práctica66
11
22
33
Introducción
El Equipo
• Credit Suisse
• Stephen Colebourne
• JUG Chennai
• Goldman Sachs
• Werner Keil
• Y otros...
• Credit Suisse
• Stephen Colebourne
• London Java Community
• Caxton Associates
• Goldman Sachs
• JP Morgan/Chase
• Werner Keil
Grupo
Soporte
Grupo
Experto
• JUG Chennai
• London Java Community
• CEJUG
JUGs
Participantes
https://jcp.org/en/jsr/detail?id=354
https://java.net/projects/adoptajsr/pages/WhoIsAdoptingJSRs##350_-->_#359
Anatole Tresch
Credit Suisse
Líder del JSR
Introducción
Limitaciones actuales de java.util.Currencies
No soporta monedas históricas
Por ejemplo, en la antigua Roma existían las monedas Áureo y Denario, entre otras
No soporta monedas no-estandar (no definidas en ISO-4217)
Por ejemplo, hay países en dónde vacas y camellos pueden representar valores
monetarios
No soporta monedas virtuales
BitCoin, Facebook credits, Linden Dollar (Second life), etc.
No se puede extender
Introducción
Objetivos del JSR-354
• Proveer un API para el manejo de monedas y dinero en Java
• Soportar el estándar ISO-4217 y monedas personalizadas (por
ejemplo virtuales), así como la representación de valores monetarios
• Ofrecer operaciones aritméticas entre valores monetarios, incluso de
diferentes monedas, y conversión entre éstos
Introducción
Retos del JSR-354
• Que sea un API simple, pero aplicable a los casos más comunes
• Mantener un rendimiento óptimo que permita usarlo en aplicaciones
de alto desempeño como por ejemplo aplicaciones de comercio
electrónico.
• Que se pueda extender, dado que existen diferencias en cuanto a la
precisión, conversión y formato de los valores monetarios. Ejemplos:
Redondeo de valores monetarios en Suiza y Argentina
El formato de la Rupia India: 12,34,00,000
Introducción
Paquetes principales JSR-354
Principal: javax.money
CurrencyUnit, MonetaryContext, MonetaryCurrencies, MonetaryAmount
MonetaryOperator...
Formato: javax.money.format
MonetaryFormats, MontaryAmountFormat...
Conversión: javax.money.convert
CurrencyConversion, ExchangeRate...
Introducción
javax.money.MonetaryContext
Describe las capacidades que tiene una moneda
Por ejemplo describe aspectos comunes como precisión, escala, etc.
Accesible dese cualquier valor monetario
+MonetaryAmount.getMonetaryContext():MonetaryContext
Inmutable, serializable y apta para concurrencia
Monedas y Valores Monetarios
Monedas
//Representa una moneda
public interface CurrencyUnit {
public String getCurrencyCode();
public int getNumericCode();
public int getDefaultFractionDigits();
public CurrencyContext getCurrencyContext();
}
//Fabrica de monedas
public final class MonetaryCurrencies{
public CurrencyUnit getCurrency(String currencyCode);
public CurrencyUnit getCurrency(Locale locale);
public boolean isCurrencyAvailable(...);
public Collection<CurrencyUnit> getCurrencies(CurrencyQuery query);
}
Monedas y Valores Monetarios
Monedas
//Moneda por código ISO-4217
CurrencyUnit usDolar = MonetaryCurrencies.getCurrency("USD");
CurrencyUnit euro = MonetaryCurrencies.getCurrency("EUR");
CurrencyUnit pesos = MonetaryCurrencies.getCurrency("COP");
//Moneda por localidad
CurrencyUnit euro = MonetaryCurrencies.getCurrency(Locale.GERMANY);
CurrencyUnit yen = MonetaryCurrencies.getCurrency(Locale.JAPAN);
CurrencyUnit canadianDollar = MonetaryCurrencies.getCurrency(Locale.CANADA);
Monedas y Valores Monetarios
Valores Monetarios
public interface MonetaryAmount extends CurrencySupplier, NumberSupplier,
Comparable<MonetaryAmount> {
public MonetaryContext getMonetaryContext();
...
public MonetaryAmount with(MonetaryOperator operator);
public <R> R query(MonetaryQuery<R> query);
public MonetaryAmountFactory<? extends MonetaryAmount> getFactory();
...
public boolean isLessThanOrEqualTo(MonetaryAmount amt);
public boolean isLessThan(MonetaryAmount amt);
public boolean isEqualTo(MonetaryAmount amt);
public int signum();
...
public MonetaryAmount add(MonetaryAmount amount);
public MonetaryAmount subtract(MonetaryAmount amount);
public MonetaryAmount divide(long number);
public MonetaryAmount multiply(Number number);
public MonetaryAmount remainder(double number);
}
Valor Monetario
• Moneda
• Valor Numérico
• Funciones
aritméticas
• Diseño funcional
• API fluido
Monedas y Valores Monetarios
Valores Monetarios
// Valores monetarios en diferentes monedas
MonetaryAmount dolar = MonetaryAmounts.getDefaultAmountFactory()
.setCurrency("USD")
.setNumber(1266.15)
.create();
MonetaryAmount peso = MonetaryAmounts.getDefaultAmountFactory()
.setCurrency("COP")
.setNumber(100_000)
.create();
MonetaryAmount euro = MonetaryAmounts.getDefaultAmountFactory()
.setCurrency("EUR")
.setNumber(3250.25)
.create();
Monedas y Valores Monetarios
Valores Monetarios
// Obtiene un valor monetario por defecto (MonetaryAmount)
MonetaryAmount valor = MonetaryAmounts.getDefaultAmountFactory()
.setCurrency("USD")
.setNumber(150.5)
.create();
CurrencyUnit moneda = valor.getCurrency(); // USD
NumberValue numberValue = monetaryAmount.getNumber(); //150.5
int intValue = numberValue.intValue(); // 150
double doubleValue = numberValue.doubleValue(); // 150.5
long fractionDenominator = numberValue.getAmountFractionDenominator(); // 100
long fractionNumerator = numberValue.getAmountFractionNumerator(); // 5
int precision = numberValue.getPrecision(); // 5
Monedas y Valores Monetarios
Valores Monetarios
MonetaryAmount doce = MonetaryAmounts.getDefaultAmountFactory()
.setCurrency("COP").setNumber(12).create();
MonetaryAmount cinco = MonetaryAmounts.getDefaultAmountFactory()
.setCurrency("COP").setNumber(5).create();
MonetaryAmount diecisiete = doce.add(cinco); // "COP 17"
MonetaryAmount siete = doce.subtract(cinco); // "COP 7"
MonetaryAmount veinticuatro = doce.multiply(2); // "COP 24"
// MonetaryAmount también puede ser negativo
MonetaryAmount menosSiete = cinco.subtract(doce); // "COP -7"
// Métodos útiles
boolean mayorQue = doce.isGreaterThan(cinco); // true
boolean positivo = doce.isPositive(); // true
boolean esCero = cinco.isZero(); // false
Formato y Análisis
Formato: javax.money.format.MonetaryAmountFormat
• Similar a java.text.DecimalFormat accesible por localidad (Locale)
• Soporta formatos personalizados
• Seguro para ser usado en concurrencia
• Se construye usando API fluido
Formato y Análisis
javax.money.format.MonetaryAmountFormat
// Define un valor monetario en Rupias
MonetaryAmount rupias = MonetaryAmounts.getDefaultAmountFactory()
.setCurrency("INR")
.setNumber(39101112.123456)
.create();
// Realizar formato con uno de los formatos proveidos
MonetaryAmountFormat formato = MonetaryFormats.getAmountFormat(new Locale("", "in"));
System.out.println(formato.format(rupias)); // INR 3,91,01,112.10
Formato y Análisis
javax.money.format.MonetaryAmountFormat
// Define un valor monetario en pesos
MonetaryAmount pesos = MonetaryAmounts.getDefaultAmountFactory()
.setCurrency("COP")
.setNumber(1_250_328)
.create();
// Realizar formato con uno de los formatos proveidos
MonetaryAmountFormat formato = MonetaryFormats.getAmountFormat(new Locale("", "co"));
System.out.println(formato.format(pesos)); // COP1.250.328,00
//El mismo formato se puede usar para obtener un valor monetario a partir de una cadena (parse)
MonetaryAmount parsed = formato.parse("COP 500");
// También podemos tener un formato peronalizado
MonetaryAmountFormat personalizado = MonetaryFormats.getAmountFormat(
AmountFormatQueryBuilder.of(new Locale("", "co"))
.set("pattern", "#,##0.00;(#,##0.00)")
.build());
Tasas de cambio y Conversión
Tasas de cambio: javax.money.ExchangeRate
• Tasas de cambio modelan la conversión entre monedas.
• Se obtienen a partir de unos provedores de este servicio entre los
que se encuentran: El Banco Central Europeo (ECB) y el Fondo
Monetario Internacional (IFM)
• Importante: El JSR define que deben existir proveedores de
servicio de tasas de cambio, pero es la implementación quién
define cuáles y cómo se accede a su información.
Tasas de cambio y Conversión
Tasas de cambio: javax.money.ExchangeRate
// Obtiene el proveedor de servicio de tasas de cambio por defecto
ExchangeRateProvider prov = MonetaryConversions.getExchangeRateProvider();
// Obtiene un proveedor de servicio de tasas de cambio específico
prov = MonetaryConversions.getExchangeRateProvider("IMF");
// Obtiene una cadena de proveedores de servicio de tasas de cambio
prov = MonetaryConversions.getExchangeRateProvider("ECB", "IMF");
// Obtiene la tasa de cambio entre dos monedas
ExchangeRate cambio = prov.getExchangeRate("COP", "USD");
//Métodos útiles
NumberValue factor = cambio.getFactor(); // valor del cambio
CurrencyUnit monedaBase = cambio.getBaseCurrency(); // COP
CurrencyUnit monedaDestino = cambio.getCurrency(); // USD
Tasas de cambio y Conversión
Conversión
// Define un valor monetario en pesos
MonetaryAmount pesos = MonetaryAmounts.getDefaultAmountFactory()
.setCurrency("COP")
.setNumber(1_000)
.create();
// Obtiene el proveedor Fondo Monetario Internacional
ExchangeRateProvider prov = MonetaryConversions.getExchangeRateProvider("IMF");
//Este objeto realizará el cambio a dólar
CurrencyConversion conv = prov.getCurrencyConversion("USD");
//Realiza la conversión
MonetaryAmount dolar = pesos.with(conv);
Extensiones
javax.money.MonetaryOperator
• Toma un valor monetario y produce otro con valor diferente o con
moneda diferente o ambos.
• Estos operadores pueden ser aplicados a cualquier valor
monetario:
public interface MonetaryAmount... {
...
public MonetaryAmount with (MonetaryOperator operator);
}
@FunctionalInterface
public interface MonetaryOperator extends UnaryOperator<MonetaryAmount> {
}
Extensiones
Casos de Uso: javax.money.MonetaryOperator
// Define un valor monetario en pesos
MonetaryAmount pesos =
MonetaryAmounts.getDefaultAmountFactory()
.setCurrency("COP")
.setNumber(100.321)
.create();
// Redondea
MonetaryRounding rounding =
MonetaryRoundings.getRounding(
MonetaryCurrencies.getCurrency("COP"));
MonetaryAmount redondeo = pesos.with(rounding);
// Calcula el 10% del valor monetario
MonetaryAmount porcentaje = redondeo.with(
MonetaryUtil.percent(10));
Permite extender las
operaciones algorítmitcas
provistas:
• Porcentajes
• Redondeo
• Operaciones Financieras
• ...
Enlaces de interés
JSR-354 Monedas y DineroJSR-354 Monedas y Dinero
Página del proyecto en Java.net
http://java.net/projects/javamoney
JSR
Encuentras la información de la especificación, equipo de trabajo, etc.
https://jcp.org/en/jsr/detail?id=354
Proyecto en Github
Encuentras las últimas fuentes y ejemplos
http://javamoney.github.io/
Blogs de referencia
Encuentras ejemplos y otras notas usadas también en esta presentación
http://www.mscharhag.com/2014/12/java-jsr-354-money-and-currency-api.html
JSR354: Moneda y Dinero

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Por pagar
Por pagarPor pagar
Por pagar
 
05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos
 
Curso iOS
Curso iOSCurso iOS
Curso iOS
 
Profesora Asociada Facultad de Ingeniería UTB
Profesora Asociada Facultad de Ingeniería UTBProfesora Asociada Facultad de Ingeniería UTB
Profesora Asociada Facultad de Ingeniería UTB
 
3 desarollo manejo datos capitulo 3 -02 busqueda arreglo objetos
3 desarollo manejo datos capitulo 3 -02 busqueda arreglo objetos3 desarollo manejo datos capitulo 3 -02 busqueda arreglo objetos
3 desarollo manejo datos capitulo 3 -02 busqueda arreglo objetos
 
Semana 5 Java Swing
Semana 5   Java SwingSemana 5   Java Swing
Semana 5 Java Swing
 
Herencia y polimorfismo
Herencia y polimorfismoHerencia y polimorfismo
Herencia y polimorfismo
 
Leccion 04 plataforma java operadores especiales prototipos paso por refere...
Leccion 04   plataforma java operadores especiales prototipos paso por refere...Leccion 04   plataforma java operadores especiales prototipos paso por refere...
Leccion 04 plataforma java operadores especiales prototipos paso por refere...
 
Semana 2 Clases y Objetos en Java
Semana 2   Clases y Objetos en JavaSemana 2   Clases y Objetos en Java
Semana 2 Clases y Objetos en Java
 
Intro aplicaciones web con php
Intro aplicaciones web con phpIntro aplicaciones web con php
Intro aplicaciones web con php
 
SMA_Agentes
SMA_AgentesSMA_Agentes
SMA_Agentes
 
Semana 4 Introduccion Javascript
Semana 4   Introduccion JavascriptSemana 4   Introduccion Javascript
Semana 4 Introduccion Javascript
 
Semana 1 Estructuras de Control en Java
Semana 1   Estructuras de Control en JavaSemana 1   Estructuras de Control en Java
Semana 1 Estructuras de Control en Java
 
Examen
Examen Examen
Examen
 
Progra final examen
Progra final examen Progra final examen
Progra final examen
 
Guía resumen JavaScript
Guía resumen JavaScriptGuía resumen JavaScript
Guía resumen JavaScript
 
Grupo1
Grupo1Grupo1
Grupo1
 
Intro
IntroIntro
Intro
 
U0108985
U0108985U0108985
U0108985
 
Serialización personalizada
Serialización personalizadaSerialización personalizada
Serialización personalizada
 

Destacado

Nuestro cuento coeducativo ep 2009
Nuestro cuento coeducativo ep 2009Nuestro cuento coeducativo ep 2009
Nuestro cuento coeducativo ep 2009sergio romero
 
Adriana primera entrega
Adriana primera entregaAdriana primera entrega
Adriana primera entregaYerikson Huz
 
Colorde sevilla
Colorde sevillaColorde sevilla
Colorde sevillaTere
 
Granada 1
Granada 1Granada 1
Granada 1Tere
 
6 mantenimiento de equipos informáticos
6 mantenimiento de equipos informáticos6 mantenimiento de equipos informáticos
6 mantenimiento de equipos informáticosconrado perea
 
¿Qué és esa cosa llamada violencia?
¿Qué és esa cosa llamada violencia?¿Qué és esa cosa llamada violencia?
¿Qué és esa cosa llamada violencia?Gloria A
 
Tratamiento de la imagen fija
Tratamiento de la imagen fijaTratamiento de la imagen fija
Tratamiento de la imagen fijaAida March
 
4 clasificación de las computadoras
4 clasificación de las computadoras4 clasificación de las computadoras
4 clasificación de las computadorasconrado perea
 
Clase de-teologia-sistematica-119336920795215-5
Clase de-teologia-sistematica-119336920795215-5Clase de-teologia-sistematica-119336920795215-5
Clase de-teologia-sistematica-119336920795215-5William Arango
 
Tema 2 la formación del pensamiento crítico y científico.
Tema 2 la formación del pensamiento crítico y científico.Tema 2 la formación del pensamiento crítico y científico.
Tema 2 la formación del pensamiento crítico y científico.Alma Maité Barajas Cárdenas
 
DEL DICHO AL HECHO: sobre Monitoreo e Insights en Social Media.
DEL DICHO AL HECHO: sobre Monitoreo e Insights en Social Media.DEL DICHO AL HECHO: sobre Monitoreo e Insights en Social Media.
DEL DICHO AL HECHO: sobre Monitoreo e Insights en Social Media.Pablo Di Meglio
 

Destacado (20)

Ideas en la historia acerca de la naturaleza
Ideas en la historia acerca de la naturalezaIdeas en la historia acerca de la naturaleza
Ideas en la historia acerca de la naturaleza
 
Nuestro cuento coeducativo ep 2009
Nuestro cuento coeducativo ep 2009Nuestro cuento coeducativo ep 2009
Nuestro cuento coeducativo ep 2009
 
Adriana primera entrega
Adriana primera entregaAdriana primera entrega
Adriana primera entrega
 
El Ferrocarril
El FerrocarrilEl Ferrocarril
El Ferrocarril
 
Oms informe violencia 2002
Oms informe violencia 2002Oms informe violencia 2002
Oms informe violencia 2002
 
Colorde sevilla
Colorde sevillaColorde sevilla
Colorde sevilla
 
Granada 1
Granada 1Granada 1
Granada 1
 
6 mantenimiento de equipos informáticos
6 mantenimiento de equipos informáticos6 mantenimiento de equipos informáticos
6 mantenimiento de equipos informáticos
 
¿Qué és esa cosa llamada violencia?
¿Qué és esa cosa llamada violencia?¿Qué és esa cosa llamada violencia?
¿Qué és esa cosa llamada violencia?
 
Tratamiento de la imagen fija
Tratamiento de la imagen fijaTratamiento de la imagen fija
Tratamiento de la imagen fija
 
Icono rutas 2012
Icono rutas 2012Icono rutas 2012
Icono rutas 2012
 
4 clasificación de las computadoras
4 clasificación de las computadoras4 clasificación de las computadoras
4 clasificación de las computadoras
 
Clase de-teologia-sistematica-119336920795215-5
Clase de-teologia-sistematica-119336920795215-5Clase de-teologia-sistematica-119336920795215-5
Clase de-teologia-sistematica-119336920795215-5
 
Tema 2 la formación del pensamiento crítico y científico.
Tema 2 la formación del pensamiento crítico y científico.Tema 2 la formación del pensamiento crítico y científico.
Tema 2 la formación del pensamiento crítico y científico.
 
Mi región
Mi regiónMi región
Mi región
 
DEL DICHO AL HECHO: sobre Monitoreo e Insights en Social Media.
DEL DICHO AL HECHO: sobre Monitoreo e Insights en Social Media.DEL DICHO AL HECHO: sobre Monitoreo e Insights en Social Media.
DEL DICHO AL HECHO: sobre Monitoreo e Insights en Social Media.
 
Guía de indicadores 2013
Guía de indicadores 2013Guía de indicadores 2013
Guía de indicadores 2013
 
Redes locales 11
Redes locales 11Redes locales 11
Redes locales 11
 
Jesus repazara
Jesus repazaraJesus repazara
Jesus repazara
 
Tejidonervioso
TejidonerviosoTejidonervioso
Tejidonervioso
 

Similar a JSR354: Moneda y Dinero

Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Juan Manuel
 
Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Facescok12v
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql ServerCorfapo
 
Meetup Madrid 6 Marzo 2024 - MuleSoft en el mundo real: ejemplos de casos de ...
Meetup Madrid 6 Marzo 2024 - MuleSoft en el mundo real: ejemplos de casos de ...Meetup Madrid 6 Marzo 2024 - MuleSoft en el mundo real: ejemplos de casos de ...
Meetup Madrid 6 Marzo 2024 - MuleSoft en el mundo real: ejemplos de casos de ...jorgelebrato
 
Procedimientos almacenados
Procedimientos almacenadosProcedimientos almacenados
Procedimientos almacenadosbat1820
 
Un framework para la generación automática de ejercicios mediante técnicas de...
Un framework para la generación automática de ejercicios mediante técnicas de...Un framework para la generación automática de ejercicios mediante técnicas de...
Un framework para la generación automática de ejercicios mediante técnicas de...Pablo Gómez Abajo
 
Estructuras repetitivas-dayana-y-ana
Estructuras repetitivas-dayana-y-anaEstructuras repetitivas-dayana-y-ana
Estructuras repetitivas-dayana-y-anaDayana Hernandez
 
ETL: Logging y auditoría en SSIS
ETL: Logging y auditoría en SSISETL: Logging y auditoría en SSIS
ETL: Logging y auditoría en SSISSolidQ
 
Estructuras básicas
Estructuras básicas Estructuras básicas
Estructuras básicas alancardona3
 

Similar a JSR354: Moneda y Dinero (20)

Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
 
Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Faces
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server
 
Meetup Madrid 6 Marzo 2024 - MuleSoft en el mundo real: ejemplos de casos de ...
Meetup Madrid 6 Marzo 2024 - MuleSoft en el mundo real: ejemplos de casos de ...Meetup Madrid 6 Marzo 2024 - MuleSoft en el mundo real: ejemplos de casos de ...
Meetup Madrid 6 Marzo 2024 - MuleSoft en el mundo real: ejemplos de casos de ...
 
Manual Basico De Struts
Manual Basico De StrutsManual Basico De Struts
Manual Basico De Struts
 
Procedimientos almacenados
Procedimientos almacenadosProcedimientos almacenados
Procedimientos almacenados
 
Qué es SQL
Qué es SQL Qué es SQL
Qué es SQL
 
Un framework para la generación automática de ejercicios mediante técnicas de...
Un framework para la generación automática de ejercicios mediante técnicas de...Un framework para la generación automática de ejercicios mediante técnicas de...
Un framework para la generación automática de ejercicios mediante técnicas de...
 
103305862 t-sql
103305862 t-sql103305862 t-sql
103305862 t-sql
 
t-sql
t-sqlt-sql
t-sql
 
Taller completo
Taller completoTaller completo
Taller completo
 
Estructuras repetitivas-dayana-y-ana
Estructuras repetitivas-dayana-y-anaEstructuras repetitivas-dayana-y-ana
Estructuras repetitivas-dayana-y-ana
 
ETL: Logging y auditoría en SSIS
ETL: Logging y auditoría en SSISETL: Logging y auditoría en SSIS
ETL: Logging y auditoría en SSIS
 
Sql td a
Sql   td aSql   td a
Sql td a
 
Tarea Nº1
Tarea Nº1Tarea Nº1
Tarea Nº1
 
Tarea Nº1
Tarea Nº1Tarea Nº1
Tarea Nº1
 
Tarea Nº1
Tarea Nº1Tarea Nº1
Tarea Nº1
 
Amnel
AmnelAmnel
Amnel
 
Jsf
JsfJsf
Jsf
 
Estructuras básicas
Estructuras básicas Estructuras básicas
Estructuras básicas
 

JSR354: Moneda y Dinero

  • 1. JSR 354 Moneda y Dinero CLOJUG 24-ENE-2015 http://www.clojug.org Imagen tomada de http://elpueblo.com.co/
  • 2. JSR 354 Moneda y Dinero Anatole Tresch @atsticks Regular Conference Speaker Specification Lead JSR 354 Proyecto en Java.net http://java.net/projects/javamoney JSR https://jcp.org/en/jsr/detail?id=354 Proyecto en Github http://javamoney.github.io/ Twitter @jsr354
  • 3. JSR 354 Moneda y Dinero Los valores monetarios son parte fundamental de muchas aplicaciones, sin embargo, el JDK provee poco o ningún soporte para éstos. La clase existente java.util.Currency es solamente una estructura para la representación de las monedas actuales (ISO-4217), pero no para representar sus valores asociados o monedas personalizadas. El JDK tampoco ofrece soporte para operaciones aritméticas con monedas o conversión entre ellas ni tampoco un tipo de valor estándar para representar un valor monetario. “ Texto tomado de la especificación del JSR-354
  • 4. Agenda Introducción Tasas de Cambio y Conversión Monedas y Valores Monetarios Formato y Análisis Extensiones 44 55 Documentación y Práctica66 11 22 33
  • 5. Introducción El Equipo • Credit Suisse • Stephen Colebourne • JUG Chennai • Goldman Sachs • Werner Keil • Y otros... • Credit Suisse • Stephen Colebourne • London Java Community • Caxton Associates • Goldman Sachs • JP Morgan/Chase • Werner Keil Grupo Soporte Grupo Experto • JUG Chennai • London Java Community • CEJUG JUGs Participantes https://jcp.org/en/jsr/detail?id=354 https://java.net/projects/adoptajsr/pages/WhoIsAdoptingJSRs##350_-->_#359 Anatole Tresch Credit Suisse Líder del JSR
  • 6. Introducción Limitaciones actuales de java.util.Currencies No soporta monedas históricas Por ejemplo, en la antigua Roma existían las monedas Áureo y Denario, entre otras No soporta monedas no-estandar (no definidas en ISO-4217) Por ejemplo, hay países en dónde vacas y camellos pueden representar valores monetarios No soporta monedas virtuales BitCoin, Facebook credits, Linden Dollar (Second life), etc. No se puede extender
  • 7. Introducción Objetivos del JSR-354 • Proveer un API para el manejo de monedas y dinero en Java • Soportar el estándar ISO-4217 y monedas personalizadas (por ejemplo virtuales), así como la representación de valores monetarios • Ofrecer operaciones aritméticas entre valores monetarios, incluso de diferentes monedas, y conversión entre éstos
  • 8. Introducción Retos del JSR-354 • Que sea un API simple, pero aplicable a los casos más comunes • Mantener un rendimiento óptimo que permita usarlo en aplicaciones de alto desempeño como por ejemplo aplicaciones de comercio electrónico. • Que se pueda extender, dado que existen diferencias en cuanto a la precisión, conversión y formato de los valores monetarios. Ejemplos: Redondeo de valores monetarios en Suiza y Argentina El formato de la Rupia India: 12,34,00,000
  • 9. Introducción Paquetes principales JSR-354 Principal: javax.money CurrencyUnit, MonetaryContext, MonetaryCurrencies, MonetaryAmount MonetaryOperator... Formato: javax.money.format MonetaryFormats, MontaryAmountFormat... Conversión: javax.money.convert CurrencyConversion, ExchangeRate...
  • 10. Introducción javax.money.MonetaryContext Describe las capacidades que tiene una moneda Por ejemplo describe aspectos comunes como precisión, escala, etc. Accesible dese cualquier valor monetario +MonetaryAmount.getMonetaryContext():MonetaryContext Inmutable, serializable y apta para concurrencia
  • 11. Monedas y Valores Monetarios Monedas //Representa una moneda public interface CurrencyUnit { public String getCurrencyCode(); public int getNumericCode(); public int getDefaultFractionDigits(); public CurrencyContext getCurrencyContext(); } //Fabrica de monedas public final class MonetaryCurrencies{ public CurrencyUnit getCurrency(String currencyCode); public CurrencyUnit getCurrency(Locale locale); public boolean isCurrencyAvailable(...); public Collection<CurrencyUnit> getCurrencies(CurrencyQuery query); }
  • 12. Monedas y Valores Monetarios Monedas //Moneda por código ISO-4217 CurrencyUnit usDolar = MonetaryCurrencies.getCurrency("USD"); CurrencyUnit euro = MonetaryCurrencies.getCurrency("EUR"); CurrencyUnit pesos = MonetaryCurrencies.getCurrency("COP"); //Moneda por localidad CurrencyUnit euro = MonetaryCurrencies.getCurrency(Locale.GERMANY); CurrencyUnit yen = MonetaryCurrencies.getCurrency(Locale.JAPAN); CurrencyUnit canadianDollar = MonetaryCurrencies.getCurrency(Locale.CANADA);
  • 13. Monedas y Valores Monetarios Valores Monetarios public interface MonetaryAmount extends CurrencySupplier, NumberSupplier, Comparable<MonetaryAmount> { public MonetaryContext getMonetaryContext(); ... public MonetaryAmount with(MonetaryOperator operator); public <R> R query(MonetaryQuery<R> query); public MonetaryAmountFactory<? extends MonetaryAmount> getFactory(); ... public boolean isLessThanOrEqualTo(MonetaryAmount amt); public boolean isLessThan(MonetaryAmount amt); public boolean isEqualTo(MonetaryAmount amt); public int signum(); ... public MonetaryAmount add(MonetaryAmount amount); public MonetaryAmount subtract(MonetaryAmount amount); public MonetaryAmount divide(long number); public MonetaryAmount multiply(Number number); public MonetaryAmount remainder(double number); } Valor Monetario • Moneda • Valor Numérico • Funciones aritméticas • Diseño funcional • API fluido
  • 14. Monedas y Valores Monetarios Valores Monetarios // Valores monetarios en diferentes monedas MonetaryAmount dolar = MonetaryAmounts.getDefaultAmountFactory() .setCurrency("USD") .setNumber(1266.15) .create(); MonetaryAmount peso = MonetaryAmounts.getDefaultAmountFactory() .setCurrency("COP") .setNumber(100_000) .create(); MonetaryAmount euro = MonetaryAmounts.getDefaultAmountFactory() .setCurrency("EUR") .setNumber(3250.25) .create();
  • 15. Monedas y Valores Monetarios Valores Monetarios // Obtiene un valor monetario por defecto (MonetaryAmount) MonetaryAmount valor = MonetaryAmounts.getDefaultAmountFactory() .setCurrency("USD") .setNumber(150.5) .create(); CurrencyUnit moneda = valor.getCurrency(); // USD NumberValue numberValue = monetaryAmount.getNumber(); //150.5 int intValue = numberValue.intValue(); // 150 double doubleValue = numberValue.doubleValue(); // 150.5 long fractionDenominator = numberValue.getAmountFractionDenominator(); // 100 long fractionNumerator = numberValue.getAmountFractionNumerator(); // 5 int precision = numberValue.getPrecision(); // 5
  • 16. Monedas y Valores Monetarios Valores Monetarios MonetaryAmount doce = MonetaryAmounts.getDefaultAmountFactory() .setCurrency("COP").setNumber(12).create(); MonetaryAmount cinco = MonetaryAmounts.getDefaultAmountFactory() .setCurrency("COP").setNumber(5).create(); MonetaryAmount diecisiete = doce.add(cinco); // "COP 17" MonetaryAmount siete = doce.subtract(cinco); // "COP 7" MonetaryAmount veinticuatro = doce.multiply(2); // "COP 24" // MonetaryAmount también puede ser negativo MonetaryAmount menosSiete = cinco.subtract(doce); // "COP -7" // Métodos útiles boolean mayorQue = doce.isGreaterThan(cinco); // true boolean positivo = doce.isPositive(); // true boolean esCero = cinco.isZero(); // false
  • 17. Formato y Análisis Formato: javax.money.format.MonetaryAmountFormat • Similar a java.text.DecimalFormat accesible por localidad (Locale) • Soporta formatos personalizados • Seguro para ser usado en concurrencia • Se construye usando API fluido
  • 18. Formato y Análisis javax.money.format.MonetaryAmountFormat // Define un valor monetario en Rupias MonetaryAmount rupias = MonetaryAmounts.getDefaultAmountFactory() .setCurrency("INR") .setNumber(39101112.123456) .create(); // Realizar formato con uno de los formatos proveidos MonetaryAmountFormat formato = MonetaryFormats.getAmountFormat(new Locale("", "in")); System.out.println(formato.format(rupias)); // INR 3,91,01,112.10
  • 19. Formato y Análisis javax.money.format.MonetaryAmountFormat // Define un valor monetario en pesos MonetaryAmount pesos = MonetaryAmounts.getDefaultAmountFactory() .setCurrency("COP") .setNumber(1_250_328) .create(); // Realizar formato con uno de los formatos proveidos MonetaryAmountFormat formato = MonetaryFormats.getAmountFormat(new Locale("", "co")); System.out.println(formato.format(pesos)); // COP1.250.328,00 //El mismo formato se puede usar para obtener un valor monetario a partir de una cadena (parse) MonetaryAmount parsed = formato.parse("COP 500"); // También podemos tener un formato peronalizado MonetaryAmountFormat personalizado = MonetaryFormats.getAmountFormat( AmountFormatQueryBuilder.of(new Locale("", "co")) .set("pattern", "#,##0.00;(#,##0.00)") .build());
  • 20. Tasas de cambio y Conversión Tasas de cambio: javax.money.ExchangeRate • Tasas de cambio modelan la conversión entre monedas. • Se obtienen a partir de unos provedores de este servicio entre los que se encuentran: El Banco Central Europeo (ECB) y el Fondo Monetario Internacional (IFM) • Importante: El JSR define que deben existir proveedores de servicio de tasas de cambio, pero es la implementación quién define cuáles y cómo se accede a su información.
  • 21. Tasas de cambio y Conversión Tasas de cambio: javax.money.ExchangeRate // Obtiene el proveedor de servicio de tasas de cambio por defecto ExchangeRateProvider prov = MonetaryConversions.getExchangeRateProvider(); // Obtiene un proveedor de servicio de tasas de cambio específico prov = MonetaryConversions.getExchangeRateProvider("IMF"); // Obtiene una cadena de proveedores de servicio de tasas de cambio prov = MonetaryConversions.getExchangeRateProvider("ECB", "IMF"); // Obtiene la tasa de cambio entre dos monedas ExchangeRate cambio = prov.getExchangeRate("COP", "USD"); //Métodos útiles NumberValue factor = cambio.getFactor(); // valor del cambio CurrencyUnit monedaBase = cambio.getBaseCurrency(); // COP CurrencyUnit monedaDestino = cambio.getCurrency(); // USD
  • 22. Tasas de cambio y Conversión Conversión // Define un valor monetario en pesos MonetaryAmount pesos = MonetaryAmounts.getDefaultAmountFactory() .setCurrency("COP") .setNumber(1_000) .create(); // Obtiene el proveedor Fondo Monetario Internacional ExchangeRateProvider prov = MonetaryConversions.getExchangeRateProvider("IMF"); //Este objeto realizará el cambio a dólar CurrencyConversion conv = prov.getCurrencyConversion("USD"); //Realiza la conversión MonetaryAmount dolar = pesos.with(conv);
  • 23. Extensiones javax.money.MonetaryOperator • Toma un valor monetario y produce otro con valor diferente o con moneda diferente o ambos. • Estos operadores pueden ser aplicados a cualquier valor monetario: public interface MonetaryAmount... { ... public MonetaryAmount with (MonetaryOperator operator); } @FunctionalInterface public interface MonetaryOperator extends UnaryOperator<MonetaryAmount> { }
  • 24. Extensiones Casos de Uso: javax.money.MonetaryOperator // Define un valor monetario en pesos MonetaryAmount pesos = MonetaryAmounts.getDefaultAmountFactory() .setCurrency("COP") .setNumber(100.321) .create(); // Redondea MonetaryRounding rounding = MonetaryRoundings.getRounding( MonetaryCurrencies.getCurrency("COP")); MonetaryAmount redondeo = pesos.with(rounding); // Calcula el 10% del valor monetario MonetaryAmount porcentaje = redondeo.with( MonetaryUtil.percent(10)); Permite extender las operaciones algorítmitcas provistas: • Porcentajes • Redondeo • Operaciones Financieras • ...
  • 25. Enlaces de interés JSR-354 Monedas y DineroJSR-354 Monedas y Dinero Página del proyecto en Java.net http://java.net/projects/javamoney JSR Encuentras la información de la especificación, equipo de trabajo, etc. https://jcp.org/en/jsr/detail?id=354 Proyecto en Github Encuentras las últimas fuentes y ejemplos http://javamoney.github.io/ Blogs de referencia Encuentras ejemplos y otras notas usadas también en esta presentación http://www.mscharhag.com/2014/12/java-jsr-354-money-and-currency-api.html