indian_formatters 0.0.2
indian_formatters: ^0.0.2 copied to clipboard
A comprehensive Flutter/Dart package for India-specific number formatting, currency, validators (PAN, Aadhaar, GST, IFSC, UPI), date utilities, and address tools. All-in-one — one import, everything included.
import 'package:flutter/material.dart';
import 'package:indian_formatters/indian_formatters.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Indian Formatters Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
useMaterial3: true,
),
home: const DemoHomePage(),
);
}
}
class DemoHomePage extends StatefulWidget {
const DemoHomePage({super.key});
@override
State<DemoHomePage> createState() => _DemoHomePageState();
}
class _DemoHomePageState extends State<DemoHomePage>
with SingleTickerProviderStateMixin {
late TabController _tabController;
@override
void initState() {
super.initState();
_tabController = TabController(length: 3, vsync: this);
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Indian Formatters Demo'),
bottom: TabBar(
controller: _tabController,
tabs: const [
Tab(text: 'Numbers & Currency'),
Tab(text: 'Validators'),
Tab(text: 'Date & Address'),
],
),
),
body: TabBarView(
controller: _tabController,
children: const [
NumberCurrencyTab(),
ValidatorsTab(),
DateAddressTab(),
],
),
);
}
}
class NumberCurrencyTab extends StatelessWidget {
const NumberCurrencyTab({super.key});
@override
Widget build(BuildContext context) {
return ListView(
padding: const EdgeInsets.all(16),
children: [
_buildSection('Number Formatting', [
_buildDemo('Indian Format', '1234567', 1234567.toIndian()),
_buildDemo('Words', '1234567', 1234567.toIndianWords()),
_buildDemo('Hindi Words', '100', 100.toWordsHindi()),
_buildDemo('Compact', '1200000', 1200000.toIndianCompact()),
_buildDemo('Compact Full', '1200000', 1200000.toIndianCompactFull()),
]),
const Divider(height: 32),
_buildSection('Currency Formatting', [
_buildDemo('Rupees', '1234567.89', 1234567.89.toRupees()),
_buildDemo('Words', '1234567.89', 1234567.89.toRupeesWords()),
_buildDemo('Compact', '1200000', 1200000.toRupeesCompact()),
_buildDemo(
'Cheque Format', '1234567.89', 1234567.89.toChequeFormat()),
]),
],
);
}
Widget _buildSection(String title, List<Widget> children) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
const SizedBox(height: 12),
...children,
],
);
}
Widget _buildDemo(String label, String input, String output) {
return Padding(
padding: const EdgeInsets.only(bottom: 12),
child: Card(
child: Padding(
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
label,
style: const TextStyle(fontWeight: FontWeight.bold),
),
const SizedBox(height: 4),
Text('Input: $input'),
const SizedBox(height: 4),
Text(
'Output: $output',
style: const TextStyle(color: Colors.blue),
),
],
),
),
),
);
}
}
class ValidatorsTab extends StatefulWidget {
const ValidatorsTab({super.key});
@override
State<ValidatorsTab> createState() => _ValidatorsTabState();
}
class _ValidatorsTabState extends State<ValidatorsTab> {
final _panController = TextEditingController(text: 'ABCPE1234F');
final _aadhaarController = TextEditingController(text: '234567890123');
final _gstController = TextEditingController(text: '27AAPFU0939F1ZV');
final _mobileController = TextEditingController(text: '9876543210');
final _ifscController = TextEditingController(text: 'SBIN0001234');
final _pincodeController = TextEditingController(text: '411001');
final _upiController = TextEditingController(text: 'someone@upi');
@override
void dispose() {
_panController.dispose();
_aadhaarController.dispose();
_gstController.dispose();
_mobileController.dispose();
_ifscController.dispose();
_pincodeController.dispose();
_upiController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return ListView(
padding: const EdgeInsets.all(16),
children: [
_buildValidatorField(
'PAN Card',
_panController,
IndianValidators.validatePAN,
extraInfo: () {
final type = IndianValidators.getPANType(_panController.text);
return 'Type: ${type.name}';
},
),
_buildValidatorField(
'Aadhaar',
_aadhaarController,
IndianValidators.validateAadhaar,
extraInfo: () {
return 'Masked: ${IndianValidators.maskAadhaar(_aadhaarController.text)}';
},
),
_buildValidatorField(
'GST Number',
_gstController,
IndianValidators.validateGST,
extraInfo: () {
final state = IndianValidators.getGSTState(_gstController.text);
return 'State: ${state ?? 'Unknown'}';
},
),
_buildValidatorField(
'Mobile Number',
_mobileController,
IndianValidators.validateMobile,
extraInfo: () {
return 'Formatted: ${IndianValidators.formatMobile(_mobileController.text)}';
},
),
_buildValidatorField(
'IFSC Code',
_ifscController,
IndianValidators.validateIFSC,
extraInfo: () {
final bank = IndianValidators.getBankFromIFSC(_ifscController.text);
return 'Bank: ${bank ?? 'Unknown'}';
},
),
_buildValidatorField(
'PIN Code',
_pincodeController,
IndianValidators.validatePincode,
extraInfo: () {
final state =
IndianValidators.getStateFromPincode(_pincodeController.text);
return 'Region: ${state ?? 'Unknown'}';
},
),
_buildValidatorField(
'UPI ID',
_upiController,
IndianValidators.validateUPI,
extraInfo: () {
final provider =
IndianValidators.getUPIProvider(_upiController.text);
return 'Provider: ${provider ?? 'Unknown'}';
},
),
],
);
}
Widget _buildValidatorField(
String label,
TextEditingController controller,
String? Function(String?) validator, {
String Function()? extraInfo,
}) {
return Padding(
padding: const EdgeInsets.only(bottom: 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextFormField(
controller: controller,
decoration: InputDecoration(
labelText: label,
border: const OutlineInputBorder(),
),
validator: validator,
autovalidateMode: AutovalidateMode.always,
),
if (extraInfo != null && validator(controller.text) == null)
Padding(
padding: const EdgeInsets.only(top: 8),
child: Text(
extraInfo(),
style: const TextStyle(color: Colors.blue, fontSize: 12),
),
),
],
),
);
}
}
class DateAddressTab extends StatelessWidget {
const DateAddressTab({super.key});
@override
Widget build(BuildContext context) {
final now = DateTime.now();
final address = IndianAddressFormatter.format(
line1: '123 Main Street',
line2: 'Koregaon Park',
city: 'Pune',
state: 'Maharashtra',
pincode: '411001',
);
return ListView(
padding: const EdgeInsets.all(16),
children: [
_buildSection('Date Formatting', [
_buildDemo('Indian Format', now.toString(), now.toIndianFormat()),
_buildDemo('Hindi Format', now.toString(), now.toHindiFormat()),
_buildDemo('Devanagari', now.toString(), now.toDevanagari()),
_buildDemo('Fiscal Year', now.toString(), now.fiscalYear()),
_buildDemo(
'Financial Quarter', now.toString(), now.financialQuarter()),
_buildDemo('Hindu Month', now.toString(), now.hinduMonthName()),
]),
const Divider(height: 32),
_buildSection('States & Address', [
_buildStateDemo('Maharashtra', 'MH'),
_buildStateDemo('Delhi', 'DL'),
_buildStateDemo('Karnataka', 'KA'),
const SizedBox(height: 12),
Card(
child: Padding(
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Formatted Address',
style: TextStyle(fontWeight: FontWeight.bold),
),
const SizedBox(height: 8),
Text(address.formatted),
],
),
),
),
]),
],
);
}
Widget _buildSection(String title, List<Widget> children) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
const SizedBox(height: 12),
...children,
],
);
}
Widget _buildDemo(String label, String input, String output) {
return Padding(
padding: const EdgeInsets.only(bottom: 12),
child: Card(
child: Padding(
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
label,
style: const TextStyle(fontWeight: FontWeight.bold),
),
const SizedBox(height: 4),
Text(
'Output: $output',
style: const TextStyle(color: Colors.blue),
),
],
),
),
),
);
}
Widget _buildStateDemo(String stateName, String code) {
final state = IndianStates.byCode(code);
if (state == null) return const SizedBox.shrink();
return Padding(
padding: const EdgeInsets.only(bottom: 12),
child: Card(
child: Padding(
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
state.name,
style: const TextStyle(fontWeight: FontWeight.bold),
),
const SizedBox(height: 4),
Text('Code: ${state.code} | GST Code: ${state.gstCode}'),
Text('Capital: ${state.capital}'),
Text('Hindi: ${state.hindiName}'),
],
),
),
),
);
}
}